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,然后A再AB.因此,为了破坏是AB那么A那么B.
C++ 11标准明确了这个(S10.1),用于多重继承
除了由构造函数(12.6.2),清理(12.4)和存储布局(9.2,11.1)的初始化语义指定之外,派生的顺序并不重要.
但是你可以保证销毁订单与构造相反.
| 归档时间: |
|
| 查看次数: |
1769 次 |
| 最近记录: |