构造函数调用序列

Constructor call sequence

本文关键字:函数调用      更新时间:2023-10-16

考虑以下代码:

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++标准保证了构造函数调用的顺序吗?

这是保证。源自§12.6.2 [class.base.]init]/p11 of N3797:

在非委托构造函数中,初始化按照以下顺序进行:

  • 首先,并且仅对于最派生类的构造函数(1.8),虚拟基类按照它们在基类的有向无环图的深度优先从左到右遍历中出现的顺序进行初始化,其中"从左到右"是基类在派生类base-specifier-list中的出现顺序。
  • 然后,直接基类按照它们出现在基指定符列表中的声明顺序初始化(与mem初始化器的顺序无关)。然后,非静态数据成员按照它们在类定义中声明的顺序初始化(同样与mem初始化器的顺序无关)。