1

如果我有以下层次结构:

  • F 类包含类型的成员对象(E 类和 D 类,按此顺序声明)
  • F类继承具体类C类
  • C类继承抽象/纯虚类B类
  • B类继承具体类A

如果调用 F 类对象的析构函数,则按以下顺序发生以下情况:

  1. 调用 F 类(派生最多的)析构函数并完成
  2. 调用 D 类(成员对象 2)析构函数并完成
  3. 调用 E 类(成员对象 1)析构函数并完成
  4. 调用 C 类(F 的基础)析构函数并完成
  5. 调用 A 类(B 的基础,C 的基础)析构函数并完成
  6. B类(虚拟,C的基础)析构函数被调用并完成

它是否正确?所以基本上到最后C继承了虚拟B,虚拟B继承了A,但是C被破坏了,然后是A,然后是虚拟B?

编辑:C++ 常见问题解答 说:

“虚拟基类是特殊的——它们的析构函数在最派生类的构造函数的末尾被调用”

这是我想要理解的?

4

2 回答 2

3

析构函数的执行顺序与构造函数相反。这几乎就是您需要知道的所有内容。

更新:它甚至适用于虚拟基地。您只需要意识到虚拟基是在任何其他基类之前构建的。

于 2013-02-28T20:46:09.113 回答
3

也许将析构函数调用的顺序表示为算法是最简单的。

破坏

  1. 做程序员在析构函数体内写的任何东西:F::~F() { do_this; do_that; }
  2. 销毁(调用析构函数)成员
  3. 销毁(调用析构函数)非虚拟基类
  4. 销毁(调用析构函数)虚拟基类

该算法由语言(或编译器)执行,因此程序员只能控制第一步。

注意:每个进一步的步骤都是递归的。

析构函数调用的顺序是构造函数调用的相反顺序(很高兴知道,因为构造顺序很直观)。虚拟基地的破坏顺序指定为

基类图的深度优先从左到右遍历

幸运的是,您不需要这个,因为您只有一个。

于 2013-02-28T21:35:47.947 回答