【问题标题】:Constructor call sequence [duplicate]构造函数调用序列[重复]
【发布时间】:2014-08-25 23:29:17
【问题描述】:

考虑以下代码:

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

【问题讨论】:

  • @Holt:这显然不是...?
  • @LightnessRacesinOrbit 他们是相关的;成为virtual 不会改变这种情况。但我确实认为这个问题中给出的答案比另一个问题更清楚。
  • Eduard,上述问题的virtual 部分与答案无关。你介意我们把它从问题中删除,以便这个问题更普遍适用吗?

标签: c++ inheritance constructor language-lawyer virtual-inheritance


【解决方案1】:

这是有保证的。来自 N3797 的 §12.6.2 [class.base.init]/p11:

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

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

【讨论】:

  • 在我看来,这个答案比标记为重复的答案要清楚得多。
猜你喜欢
  • 2018-10-17
  • 2020-10-14
  • 1970-01-01
  • 2015-07-02
  • 2018-11-29
  • 2014-01-29
  • 2012-02-06
  • 1970-01-01
相关资源
最近更新 更多