class vehicle{
...
};
class motorVehicle: virtual public vehicle{
...
};
class twoWheels: virtual public vehicle{
...
};
class motorcycle: public motorVehicle, public twoWheels, virtual vehicle{//(1)
....
};
(1)为什么类摩托车必须继承级车辆,当它已经包含在motorVehicle和twoWheels类中? 在书中的解释中写道,类摩托车必须继承类车辆以确保将被调用基类(车辆)的构造器。如果这个解释是正确的,我不明白为什么它会说"虚拟车辆"?这是什么类型的继承?
答案 0 :(得分:2)
首先,解决问题的方法肯定是一个解决方案,但在我看来并不是最好的。
这是为了解决所谓的diamond inheritance问题。为此,了解虚拟继承以及公共和私有继承之间的区别非常重要。
Public inheritance
表示派生类也可以被视为并转换为继承的类。在您的特定情况下,motor vehicle
可以投放到vehicle
。如果遗产是私人的。这是不可能的。
因此同样适用于motorcycle
。可以将其视为twoWheels
和motorVehicle
。但由于这两者都可以被视为车辆,因此出现了问题。如果您想将motorCycle
转换为vehicle
,该怎么办?它应首先转换为twoWheels
,然后转换为vehicle
。或者先到motorVehicle
再到vehicle
。
并且不是全部,车辆中声明的任何变量或函数也可以在motorcycle
中调用。但是它应该调用twoWheels
然后调用motorVehicle
。
因此,实质上有两个vehicles
被构造,这会产生歧义。为了解决这个问题,引入了虚拟继承。这允许您自己初始化inheritance chain中的任何类。为此,没有必要自己继承初始化的类。
这就是为什么我不同意所提出的解决方案。编写motorcycle
构造函数就足够了:
motorcycle::motorcycle():
vehicle(),//n.b. this order is Not relevant, vehicle will be constructed first. No matter the order in this list.
twoWheels(),
motorVehicle()
{
}
答案 1 :(得分:1)
此代码
class motorcycle: public motorVehicle, public twoWheels, virtual vehicle{//(1)
....
};
从motorVehicle
和twoWheels
继承您的类,这两个类都已继承vehicle
。因此,您必须消除vehicle
的构造,并将virtual vehicle
添加到继承层次结构,通过选择由任何其他继承类调用的第一个可用构造函数来实现。