[英]Order of destruction in the case of multiple inheritance
在多重继承的情况下,是否很好地定义了破坏的顺序?
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;
}
对于给定的代码,我的编译器打印:
AB
B
A
但是我使用了更复杂的构造(包括CWinApp
),我得到了不同的结果。 订单定义明确吗? 如果是这样,订购规则是什么?
来自[class.dtor]:
基础和成员按照构造函数完成的相反顺序销毁(见12.6.2)。
构造函数的排序,来自[class.base.init]:
在非委托构造函数中,初始化按以下顺序进行:
- 首先,只有最派生类(1.8)的构造函数,虚拟基类被初始化[...]
- 然后,直接基类按声明顺序初始化,因为它们出现在base-specifier-list中 (无论mem-initializers的顺序如何)。
对于你的例子:
struct AB : public B, public A
施工顺序为B
然后是A
然后是AB
。 所以破坏顺序是AB
然后是A
然后是B
C ++ 11标准明确了这个(S10.1),用于多重继承
除了由构造函数(12.6.2),清理(12.4)和存储布局(9.2,11.1)的初始化语义指定之外,派生的顺序并不重要。
但是你可以保证销毁订单与构造相反。
从友好的手册 (缩写#2一点):
- 调用类的析构函数。
- 非静态成员的析构函数与声明的相反顺序。
- 非虚拟基类的析构函数以与声明相反的顺序调用。
- 虚拟基类的析构函数以声明的相反顺序调用。
因此,您的编译器会发出以AB,B,A顺序破坏的代码。
[编辑20150725:巴里的一再评论最终让我注意到我曾打错过“这不是”,因为“这也是”。 当然,已经键入了,我看不到它,直到我做到了 。 咩。 因此,下面改变了一个词。]
这不是 isocpp.org 常见问题解答的顺序。 该条目引用了关于构造函数排序的相同问题,其中文本“注意,顺序B1然后B2(或B1a然后B1b)由基类出现在类的声明中的顺序确定,而不是在顺序中初始值设定项出现在派生类的初始化列表中。“ 出现,突出显示声明顺序是相关的顺序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.