继承层次结构:构造函数和析构函数执行顺序。

6

这里的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

每个类都有一个构造函数和虚析构函数。输出如下:
A
B
C
E
D
F
G
H
~H
~G
~F
~D
~E
~C
~B
~A
Press any key to continue . . .

但根据引用的说法,虚基类构造函数应该先执行。

我理解错了什么吗?

编辑:为了澄清我的问题,据我理解,这种行为与基类是否虚无关。但是引用坚持要使用虚基类。我的表述清楚了吗?还是有什么不对劲的地方?


请提供您使用的代码以获得更准确的答案。 - amit
@amit,这里不需要代码。这种行为是可以预料的... - Eran
1个回答

6

如果虚拟基类所继承的类没有先被构造,那么就无法构造虚拟基类。因此,在您的情况下,非虚拟基类会首先被构造,因为虚拟基类依赖于它们:C不能在AB之前构造。因此,即使C是虚拟继承的,AB确实会在C之前被构造。


1
这是在任何情况下都适用的。为什么要添加“在层次结构中的任何位置”这个短语呢? - Azodious
2
@Azodious,C++ FAQ非常棒,但我想在这种情况下缺乏进一步解释可能会有些误导。虚基类首先在任何地方构造,但构造它们涉及构造它们的基类,就像在任何情况下一样。没有其他方法可以工作,因为类必须能够依赖于其基类被初始化。 - Eran
可能有点太严格了,或者你太字面理解了。使用虚拟继承,一个类可以在层次结构中的多个位置出现。这意味着它可能有很多兄弟姐妹。我们不想精确指定虚基类相对于其兄弟姐妹的构造时间,因此我们采用了“在层次结构中任何可能的兄弟姐妹之前”规则,但这仍然不会使“在自己的基类之后”规则无效。毕竟,除非那也是虚基类,否则您不能成为自己基类的兄弟姐妹。 - MSalters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接