Atl*_*tle -1 c++ inheritance class destruction
我有一个三个类的类结构,其中两个是第三个类的基类,如下所示:
class A {
};
class B {
};
class C : public A, public B {
};
Run Code Online (Sandbox Code Playgroud)
当的实例C是被破坏,以何种顺序是基类A和B破坏?对此有什么规定吗?
有规则(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)的构造函数,虚拟基类按照它们出现在基类的有向无环图的深度优先从左到右遍历的顺序进行初始化,其中"左" -to-right"是派生类base-specifier-list中基类出现的顺序.
- 然后,直接基类按声明顺序初始化,因为它们出现在base-specifier-list中(无论mem-initializers的顺序如何).
- 然后,非静态数据成员按照它们在类定义中声明的顺序进行初始化(同样不管mem-initializers的顺序如何).
- 最后,执行构造函数体的复合语句.[注意:声明顺序的作用是确保以初始化的相反顺序销毁基础和成员子对象. - 结束说明]
因此,在简单的情况下,基本构造函数按照声明中列出的类的顺序进行调用,而析构函数以该顺序的相反方式运行.