大家好, 我正在阅读scott myers书籍的Effective C ++。有人提到虚拟基类和虚拟继承如下。
管理虚拟基类初始化的规则比非虚拟基类的规则更复杂,更不直观。初始化虚拟基础的响应性由层次结构中派生程度最高的类承担。当一个新的派生类被添加到层次结构中时,它必须承担其虚拟基础(直接和间接)的初始化责任
问题在上面的陈述中,虚拟基础calsses的初始化规则是什么,以及如上文所述,派生类必须采取的责任是什么。请举例说明。
谢谢!
答案 0 :(得分:4)
让我通过一个例子来解释引文。假设你有这些课程,
struct A { A(int x) {} };
struct B : virtual A { B(int x) : A(x) {} };
struct C : virtual A { C(int x) : A(x) {} };
注意:A
是虚拟基础!
现在您定义D
来自B
和C
:
struct D : B, C
{
//correct constructor - because A(x) is "present" in the initialization-list
D(int x) : A(x), B(x), C(x) { }
//wrong constructor - because A(x) is "absent" from the initialization-list!
//D(int x) :B(x), C(x) { }
};
请注意,D
是层次结构中最派生类,因此初始化 A
的责任在于{{1} },这就是为什么D
在其构造函数初始化列表中明确写入D
的原因(见上文)。如果您只编写 <{strong> A(x)
和B(x)
,那么它甚至不会编译。请参阅:http://www.ideone.com/sO6m5
但是一旦你写C(x)
,它编译就好了。请参阅:http://www.ideone.com/kiwh0
现在再次阅读引文,并注意粗体文字:
管理初始化的规则 虚拟基类更多 复杂且不太直观 是那些非虚拟基地。的的 初始化a的响应性 虚拟基地最多承担 层次结构中的派生类。当a 新的派生类被添加到 等级,它必须假设 初始化责任 虚拟基地(直接和 间接)
我希望这个解释可以帮助你理解这个概念!