派生类继承虚拟类c ++

时间:2015-05-03 19:41:56

标签: c++ inheritance virtual derived-class

class vehicle{
...
};
class motorVehicle: virtual public vehicle{
...
};
class twoWheels: virtual public vehicle{
...
};
class motorcycle: public motorVehicle, public twoWheels, virtual vehicle{//(1)
....
};

(1)为什么类摩托车必须继承级车辆,当它已经包含在motorVehicle和twoWheels类中? 在书中的解释中写道,类摩托车必须继承类车辆以确保将被调用基类(车辆)的构造器。如果这个解释是正确的,我不明白为什么它会说"虚拟车辆"?这是什么类型的继承?

2 个答案:

答案 0 :(得分:2)

首先,解决问题的方法肯定是一个解决方案,但在我看来并不是最好的。

这是为了解决所谓的diamond inheritance问题。为此,了解虚拟继承以及公共和私有继承之间的区别非常重要。

Public inheritance表示派生类也可以被视为并转换为继承的类。在您的特定情况下,motor vehicle可以投放到vehicle。如果遗产是私人的。这是不可能的。

因此同样适用于motorcycle。可以将其视为twoWheelsmotorVehicle。但由于这两者都可以被视为车辆,因此出现了问题。如果您想将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)
....
};

motorVehicletwoWheels继承您的类,这两个类都已继承vehicle。因此,您必须消除vehicle的构造,并将virtual vehicle添加到继承层次结构,通过选择由任何其他继承类调用的第一个可用构造函数来实现。