【问题标题】:Inheritance hierarchy: Constructor & Destructor execution sequence继承层次结构:构造函数和析构函数执行顺序
【发布时间】:2011-10-28 01:12:15
【问题描述】:

这里http://www.parashift.com/c++-faq-lite/multiple-inheritance.html 部分 [25.14] 说

首先要执行的构造函数是层次结构中任意位置的虚拟基类。

我尝试使用以下程序对其进行验证:

           A (pure virtual)
           |
           B
           |
           C
(virtual)/   \ (virtual)
       E       D
         \   /
           F
           |
           G (pure virtual)
           |
           H

每个班级都有一个 c'tor 和 virtual d'tor。输出如下:

A
B
C
E
D
F
G
H
~H
~G
~F
~D
~E
~C
~B
~A
Press any key to continue . . .

但根据引用,虚拟基类构造函数应该首先执行。

我理解错了什么?

编辑:为了澄清我的问题,根据我的理解,这种行为与基类是否为虚拟无关。但引用坚持虚拟基类。我是清楚还是有什么可疑之处?

【问题讨论】:

  • 请提供您使用的代码以获得更准确的答案。
  • @amit,这里不需要代码。这种行为是预期的......

标签: c++ inheritance constructor destructor


【解决方案1】:

如果没有先构造它们继承的类,则无法构造虚拟基类。因此,在您的情况下,构造非虚拟基类是因为虚拟基类依赖于它们:C 直到AB 都无法构造。因此,AB 确实是在C 之前构造的,尽管C 实际上是继承的。

【讨论】:

  • 在任何场景中都是如此。为什么要添加这句话anywhere in the hierarchy
  • @Azodious,C++ 常见问题解答非常棒,但我想在这种情况下,缺乏进一步的解释实际上可能有点误导。虚拟基类首先在任何地方构造,但构造它们涉及构造它们的基类,就像在任何场景中一样。它没有其他方法可以工作,因为类必须能够依赖于它们的基被初始化。
  • 这可能有点严格了,或者你读得太字面意思了。使用虚拟继承,一个类可以在层次结构中的任何位置多次出现。这意味着它可以有很多兄弟姐妹。我们不想精确指定虚拟基类何时相对于其兄弟姐妹构造,因此我们采用了“在层次结构中的任何可能兄弟姐妹之前”规则,但这仍然没有使“在您自己的基类之后”规则无效。毕竟,你不能成为你自己基类的兄弟,除非那也是一个虚拟基类。
猜你喜欢
  • 2013-10-24
  • 1970-01-01
  • 2011-12-27
  • 2011-11-24
  • 2012-11-14
  • 2016-03-23
  • 2012-04-10
相关资源
最近更新 更多