请考虑以下代码:
class A {};
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {};
D d;
Visual Studio的编译器首先调用类B的构造函数,然后调用类C的构造函数。但这是一个规则,即ISO C ++标准是否保证构造函数调用的顺序?
答案 0 :(得分:8)
这是有保证的。来自N3797的§12.6.2[class.base.init] / p11:
在非委托构造函数中,初始化按以下顺序进行:
- 首先,仅对于派生程度最高的类(1.8)的构造函数,虚拟基类按照它们出现在基类的有向无环图的深度优先从左到右遍历的顺序进行初始化,其中“从左到右”是派生类 base-specifier-list 中基类出现的顺序。
- 然后,直接基类按声明顺序初始化,因为它们出现在 base-specifier-list 中(无论 mem-initializers 的顺序如何)。 / LI>
- 然后,非静态数据成员按照在类定义中声明的顺序进行初始化(同样,无论 mem-initializers 的顺序如何)。