繁体   English   中英

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

[英]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一点):

  1. 调用类的析构函数。
  2. 非静态成员的析构函数与声明的相反顺序。
  3. 非虚拟基类的析构函数以与声明相反的顺序调用。
  4. 虚拟基类的析构函数以声明的相反顺序调用。

因此,您的编译器会发出以AB,B,A顺序破坏的代码。

[编辑20150725:巴里的一再评论最终让我注意到我曾打错过“这不是”,因为“这也是”。 当然,已经键入了,我看不到它,直到我做到了 咩。 因此,下面改变了一个词。]

不是 isocpp.org 常见问题解答的顺序。 该条目引用了关于构造函数排序的相同问题,其中文本“注意,顺序B1然后B2(或B1a然后B1b)由基类出现在类的声明中的顺序确定,而不是在顺序中初始值设定项出现在派生类的初始化列表中。“ 出现,突出显示声明顺序是相关的顺序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM