继承虚拟类C 的派生类
Derived class that inherits virtual class c++
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
添加到继承层次结构中,这是通过选择其他任何其他继承类调用的第一个可用的构造函数来做到的。
- 大小虚拟继承中的派生类
- 继承时如何构建派生类的变量?
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 派生类是从基类继承 v 指针并仅使用它,还是也有自己的 v 指针?
- "std::shared_from_this"不能由其派生类继承吗?
- 继承的数据如何在派生类中放置(排列)?
- C++具有空派生类对象的继承大小
- C++ 继承:基类中重载 operator+ 的 2 次在派生类中无法正常工作
- 如何调用继承的重载运算符<<并在派生类的输出中添加更多文本?
- 在模板派生类中继承具有类型别名的构造函数
- C++继承从基类指针访问派生类中的非虚拟函数
- C++排除通过派生类中的基类继承的类
- 派生类调用使用非继承成员的继承函数
- 多重继承中的派生类的行为类似于聚合
- 在派生类中具有相同签名但继承为受保护的函数
- 有没有办法调用基类函数,该函数在使用私有继承的派生类中被覆盖?
- 继承:动态派生类成员与静态派生类成员
- SIGSEGV 因为基/派生类的继承问题
- 从多重继承中的派生类函数调用适当的父类函数
- 继承函数是否适用于 C++ 中的基类元素或派生类元素?