class vehicle{
...
};
class motorVehicle: virtual public vehicle{
...
};
class twoWheels: virtual public vehicle{
...
};
class motorcycle: public motorVehicle, public twoWheels, virtual vehicle{//(1)
....
};
(1)当摩托车已经包含在摩托车和两台两与两台摩托车中时,为什么摩托车必须继承级别的车辆?在本书的解释中,据此写道,摩托车必须继承班级车辆,以确保将调用基类(车辆)的构造函数。如果这种解释是正确的,我不明白为什么说"虚拟工具"?这是什么类型的继承?
首先,解决给出的问题的解决方案肯定是一个解决方案,但我的拙见不是最好的。
这是解决所谓的钻石遗传问题。为此,重要的是要了解虚拟继承以及公共和私人继承之间的差异。
Public inheritance
表示派生类也可以将其视为并施放到继承的类中。在您的特殊情况下,motor vehicle
可以施放到vehicle
。遗产是私人的吗?这是不可能的。
因此,再次适用于motorcycle
。可以将其视为twoWheels
和motorVehicle
。但是由于这两种都可以视为一个问题。如果您想将motorCycle
施加到vehicle
怎么办。应该首先施放到twoWheels
,然后再施加到vehicle
。或先于motorVehicle
,然后转到vehicle
。
这不是全部,在motorcycle
中也可以调用车辆中声明的任何变量或功能。但是它应该称为twoWheels
,然后称为motorVehicle
。
因此,从本质上讲,有两个vehicles
正在构造,这产生了歧义。引入了解决此虚拟继承。这使您可以自己初始化继承链中的任何类。为此,无需亲自从初始化的班级继承。
这就是为什么我不同意提出的解决方案的原因。这样写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()
{
}
此代码
class motorcycle: public motorVehicle, public twoWheels, virtual vehicle{//(1)
....
};
从motorVehicle
和twoWheels
继承您的类,这两者都已经继承了vehicle
。因此,您必须放弃vehicle
的构建,并将virtual vehicle
添加到继承层次结构中,这是通过选择其他任何其他继承类调用的第一个可用的构造函数来做到的。