【问题标题】: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 派生自 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与D同在,这就是为什么@ 987654332@ 在其构造函数初始化列表中显式写入A(x)(见上文)。如果你写 only B(x) 和 C(x),那么它甚至不会编译。看到这个:http://www.ideone.com/sO6m5
但是一旦你写了A(x),它编译得很好。看到这个:http://www.ideone.com/kiwh0
现在再读一遍引文,注意加粗的文字:
管理初始化的规则
虚拟基类更多
复杂且不直观
是那些用于非虚拟基地的。 该
初始化a的责任
虚拟基地由大多数人承担
层次结构中的派生类。 当一个
新的派生类被添加到
层次结构,它必须假设
其初始化责任
虚拟基地(直接和
间接)
我希望这个解释能帮助你理解这个概念!