可能重复:
gcc c++ 虚拟继承问题
大家好,我正在阅读 Scott myers 的《Effective C++》。下面提到了虚拟基类和虚拟继承。
管理虚拟基类初始化的规则比非虚拟基类的规则更复杂,也更不直观。初始化虚拟基的责任由层次结构中最派生的类承担。当一个新的派生类被添加到层次结构中时,它必须为其虚拟基础(直接和间接)承担初始化责任
问题在上面的陈述中,虚拟基类的初始化规则是什么,派生类必须承担什么责任,如上文所述。请要求举例说明。
谢谢!
可能重复:
gcc c++ 虚拟继承问题
大家好,我正在阅读 Scott myers 的《Effective C++》。下面提到了虚拟基类和虚拟继承。
管理虚拟基类初始化的规则比非虚拟基类的规则更复杂,也更不直观。初始化虚拟基的责任由层次结构中最派生的类承担。当一个新的派生类被添加到层次结构中时,它必须为其虚拟基础(直接和间接)承担初始化责任
问题在上面的陈述中,虚拟基类的初始化规则是什么,派生类必须承担什么责任,如上文所述。请要求举例说明。
谢谢!
让我通过一个例子来解释这个引用。假设,你有这些课程,
struct A { A(int x) {} };
struct B : virtual A { B(int x) : A(x) {} };
struct C : virtual A { C(int x) : A(x) {} };
注意:A
是虚拟基地!
现在您定义从andD
派生: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
是 with D
,这就是为什么在它的构造函数初始化列表中D
显式写入的原因A(x)
(见上文)。如果你只 B(x)
写and C(x)
,那么它甚至不会编译。看到这个:http ://www.ideone.com/sO6m5
但是一旦你写A(x)
了,它编译得很好。看到这个:http ://www.ideone.com/kiwh0
现在再读一遍引文,注意粗体字:
管理虚拟基类初始化的规则比非虚拟基类的规则更复杂,也更不直观。初始化虚拟基的责任由层次结构中最派生的类承担。当一个新的派生类被添加到层次结构中时,它必须为其虚拟基础(直接和间接)承担初始化责任
我希望这个解释能帮助你理解这个概念!