【问题标题】:about virtual base class and virtual inheritance in C++ [duplicate]关于 C++ 中的虚拟基类和虚拟继承 [重复]
【发布时间】:2011-02-05 14:09:11
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

标签: c++ class inheritance virtual-inheritance


【解决方案1】:

让我通过一个例子来解释这个引用。假设,你有这些类,

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是层次结构中最多个派生类,所以初始化的责任AD同在,这就是为什么@ 987654332@ 在其构造函数初始化列表中显式写入A(x)(见上文)。如果你写 only B(x)C(x),那么它甚至不会编译。看到这个:http://www.ideone.com/sO6m5

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

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

管理初始化的规则 虚拟基类更多 复杂且不直观 是那些用于非虚拟基地的。 该 初始化a的责任 虚拟基地由大多数人承担 层次结构中的派生类。 当一个 新的派生类被添加到 层次结构,它必须假设 其初始化责任 虚拟基地(直接和 间接)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    相关资源
    最近更新 更多