标签:scoping c polymorphism inheritance multiple-inheritance
我有一个包含4个类的C程序:Person,Student,Employee和PartTimeStudent.
Student和Employee都派生自Person,而PartTimeStudent派生自所有3个类(使其成为派生程度最高的类).所有类都有一个名为VDescribe()的虚函数.
请参阅以下代码:
class Person
{
...
virtual void VDescribe();
...
};
class Student : virtual public Person
{
...
virtual void VDescribe();
...
};
class Employee : virtual public Person
{
...
virtual void VDescribe();
...
};
class PartTimeStudent : virtual public Person,
virtual public Student,
virtual public Employee
{
...
virtual void VDescribe();
...
};
注意:在上面的代码片段中,我省略了构造函数,析构函数和成员变量,因为它们与问题无关.
另外,我有以下代码,其中通过指针创建和访问PartTimeStudent对象.我使用作用域来调用PartTimeStudent对象中不同子对象的VDescribe()函数.
void DoTest()
{
PartTimeStudent* pPTS = new PartTimeStudent("John", 23, "NTU", "Seven-Eleven");
pPTS->VDescribe();
pPTS->::Person::VDescribe();
pPTS->::Student::VDescribe();
pPTS->::Employee::VDescribe();
}
代码编译成功,我可以调用不同版本的VDescribe().我想知道的是,这是一种访问虚拟功能的合法手段吗?这是可接受的还是气馁的做法?
解决方法:
是的,这是绕过动态调度和调用虚拟函数的特定版本而不是最终覆盖的完全合法方式.
但是,我通常会发现在课堂外看到这样的代码很奇怪,我会检查是否存在设计问题或误解.通常,这样的代码在类本身内部用于调用函数的重写版本(通常来自overrider).
标签:scoping,c,polymorphism,inheritance,multiple-inheritance 来源: https://codeday.me/bug/20190823/1697999.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。