多重继承的情况下的破坏顺序

use*_*183 10 c++ multiple-inheritance language-lawyer

在多重继承的情况下,是否很好地定义了破坏的顺序?

struct A
{
   ~A(){std::cout << "A\n";}   
};

struct B
{
   ~B(){std::cout << "B\n";}   
};

struct AB : public B, public A
{
    ~AB(){std::cout<<"AB\n";}   
};

int main()
{
    AB ab;
}
Run Code Online (Sandbox Code Playgroud)

对于给定的代码,我的编译器打印:

AB
B
A
Run Code Online (Sandbox Code Playgroud)

但我使用更复杂的结构(包括CWinApp),我得到不同的结果.订单定义明确吗?如果是这样,订购规则是什么?

Bar*_*rry 17

来自[class.dtor]:

基础和成员按照构造函数完成的相反顺序销毁(见12.6.2).

构造函数的排序,来自[class.base.init]:

在非委托构造函数中,初始化按以下顺序进行:
- 首先,仅对于派生类最多的类(1.8)的构造函数,初始化虚拟基类[...]
- 然后,直接基类在声明顺序,因为它们出现在base-specifier-list中 (无论mem-initializers的顺序如何).

对于你的例子:

struct AB : public B, public A
Run Code Online (Sandbox Code Playgroud)

施工顺序B,然后AAB.因此,为了破坏是AB那么A那么B.


Bat*_*eba 6

C++ 11标准明确了这个(S10.1),用于多重继承

除了由构造函数(12.6.2),清理(12.4)和存储布局(9.2,11.1)的初始化语义指定之外,派生的顺序并不重要.

但是你可以保证销毁订单与构造相反.