基类会以什么顺序被销毁?

时间:2013-12-07 15:48:34

标签: c++ class inheritance destruction

我有三个类的类结构,其中两个是第三个类的基类,如下所示:

class A {
};
class B {
};
class C : public A, public B {
};

当要销毁C的实例时,基类AB的销毁顺序是什么?对此有什么规定吗?

1 个答案:

答案 0 :(得分:5)

有规则(C ++11§12.4):

  

在执行析构函数的主体并销毁在主体内分配的任何自动对象之后,类X的析构函数调用X的直接非变量非静态数据成员的析构函数,X的直接基类的析构函数,如果X是派生类最多的类(12.6.2),它的析构函数调用X的虚拟基类的析构函数。调用所有析构函数,就好像它们是使用限定名称引用一样,即忽略更多派生类中的任何可能的虚拟覆盖析构函数。基础和成员按照构造函数完成的相反顺序销毁(见12.6.2)。析构函数中的return语句(6.6.3)可能不会直接返回给调用者;在将控制转移给调用者之前,调用成员和基础的析构函数。数组元素的析构函数按其构造的相反顺序调用(见12.6)。

施工顺序为(§12.6.2/ 10):

  

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

     

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

     

[注意:声明命令的目的是确保基础和成员子对象在销毁中被销毁   初始化的逆序。 - 结束说明]

因此,在简单的情况下,基本构造函数按照声明中列出的类的顺序进行调用,析构函数以相反的顺序运行。