我有三个类的类结构,其中两个是第三个的基类,如下所示:
class A {
};
class B {
};
class C : public A, public B {
};
当要销毁的实例时,基类和销毁C
的顺序是什么?这有什么规则吗?A
B
我有三个类的类结构,其中两个是第三个的基类,如下所示:
class A {
};
class B {
};
class C : public A, public B {
};
当要销毁的实例时,基类和销毁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 中的声明顺序进行初始化(无论 mem-initializers 的顺序如何)。
— 然后,非静态数据成员按照它们在类定义中声明的顺序进行初始化(同样不管 mem-initializers 的顺序)。
— 最后,执行构造函数主体的复合语句。[注意:声明顺序是为了确保基子对象和成员子对象以初始化的相反顺序被销毁。——尾注]
所以在简单的情况下,基构造函数按照类在声明中列出的顺序被调用,而析构函数则以相反的顺序运行。