【发布时间】:2018-09-05 08:33:39
【问题描述】:
如果我有如下的类继承关系
a
/ \
b c
\ |
| d
\/ \
e f
\ /
g
以下定义是否正确?
class A {};
class B: public virtual A {};
class C: public virtual A {};
class D: public C {};
class E: public B, public virtual D {};
class F: public virtual D {};
class G: public E, public F {};
我让 A 和 D 都虚拟继承,因为我假设每个联合类都需要是虚拟的。
我也不确定 C++ 如何定义上述情况的构造函数顺序。链接 https://isocpp.org/wiki/faq/multiple-inheritance#mi-vi-ctor-order 说
最先被执行的构造函数是虚基 层次结构中的任何位置的类。它们按照它们的顺序执行 出现在基图的深度优先从左到右遍历中 类,其中从左到右是指基的出现顺序 类名。
在所有虚拟基类构造函数完成后, 构造顺序一般是从基类到派生类。这 如果你想象第一个细节是最容易理解的 编译器在派生类的 ctor 中所做的事情是创建一个 对其非虚拟基类的 ctor 的隐藏调用(提示:那是 许多编译器实际上这样做的方式)。所以如果类 D 继承 从 B1 和 B2 相乘,首先执行 B1 的构造函数,然后 B2 的构造函数,然后是 D 的构造函数。这条规则是 递归应用;例如,如果 B1 继承自 B1a 和 B1b,并且 B2继承自B2a和B2b,那么最终的顺序是B1a,B1b,B1, B2a、B2b、B2、D。
请注意,顺序 B1 然后 B2(或 B1a 然后 B1b)由下式确定 基类出现在声明中的顺序 类,而不是初始化器出现在派生中的顺序 类的初始化列表。
如果是,顺序是这样的吗?
A, D, B, C, D, F, G
我不希望在 C 之前构造 D。正确的构造顺序是什么?
【问题讨论】:
标签: c++ multiple-inheritance virtual-inheritance