关于C ++中的虚基类和虚继承

时间:2011-02-05 14:09:12

标签: c++ class inheritance virtual-inheritance

  

可能重复:
  gcc c++ virtual inheritance problem

大家好,        我正在阅读scott myers书籍的Effective C ++。有人提到虚拟基类和虚拟继承如下。

  

管理虚拟基类初始化的规则比非虚拟基类的规则更复杂,更不直观。初始化虚拟基础的响应性由层次结构中派生程度最高的类承担。当一个新的派生类被添加到层次结构中时,它必须承担其虚拟基础(直接和间接)的初始化责任

问题在上面的陈述中,虚拟基础calsses的初始化规则是什么,以及如上文所述,派生类必须采取的责任是什么。请举例说明。

谢谢!

1 个答案:

答案 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来自BC

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   新的派生类被添加到   等级,它必须假设   初始化责任   虚拟基地(直接和   间接)

我希望这个解释可以帮助你理解这个概念!