1

可能重复:
gcc c++ 虚拟继承问题

大家好,我正在阅读 Scott myers 的《Effective C++》。下面提到了虚拟基类和虚拟继承。

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

问题在上面的陈述中,虚拟基类的初始化规则是什么,派生类必须承担什么责任,如上文所述。请要求举例说明。

谢谢!

4

1 回答 1

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是虚拟基地!

现在您定义从andD派生: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是 with D,这就是为什么在它的构造函数初始化列表中D显式写入的原因A(x)(见上文)。如果你 B(x)写and C(x),那么它甚至不会编译。看到这个:http ://www.ideone.com/sO6m5

但是一旦你写A(x)了,它编译得很好。看到这个:http ://www.ideone.com/kiwh0

现在再读一遍引文,注意粗体字:

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

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

于 2011-02-05T14:51:47.187 回答