【发布时间】:2018-06-20 14:44:59
【问题描述】:
我有一个包含 4 个类的 C++ 程序:Person、Student、Employee 和 PartTimeStudent。
Student 和 Employee 都派生自 Person,而 PartTimeStudent 派生自所有 3 个类(使其成为派生最多的类)。 Person、Student 和 Employee 还有一个名为 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
{
...
};
注意:在上面的代码 sn-p 中,我省略了构造函数、析构函数和成员变量,因为它们与手头的问题无关。
当我尝试编译代码时,出现以下错误:
override of virtual function "Person::VDescribe" is ambiguous
'PartTimeStudent': ambiguous inheritance of 'void Person::VDescrive(void)'
'PartTimeStudent': ambiguous inheritance of 'void Person::VDescribe(void)'
但是,只有在 Student 和 Employee 都实现 VDescribe() 时才会发生这种情况。如果其中一个类没有实现 VDescribe(),则编译成功。我仍然收到警告,例如如果我从 Employee 中省略 VDescribe(),则会出现以下警告:
'PartTimeStudent': inherits 'Student::Student::VDescribe' via dominance
请问为什么会这样?我想知道如果所有3个类都实现了VDescribe(),为什么PartTimeStudent无法编译,但是如果Student或Employee没有该功能,PartTimeStudent仍然可以编译。
【问题讨论】:
-
简单来说问题是:当有两种可能的选择时,
VDescribe应该继承哪个PartTimeStudent? -
^- 这个。如果您觉得回答很重要,请想象一下语言设计者的感受。
-
@Angew,错误以文本形式发布。
-
@tobi303 3 个选项 - 它也继承了 Person 本身!
-
@UKMonkey 感谢您向我保证我不是这里唯一的书呆子:P
标签: c++ multiple-inheritance virtual-functions overriding virtual-inheritance