如果某个类中的构造函数或析构函数依赖于要先创建或保留更长时间的另一个组件(例如,如果 A 的析构函数(上图中所示)依赖于执行其代码时仍存在 B),则构造或析构的顺序特别重要,反之亦然。
继承关系图中各个类之间的这种相互依赖项本质上是危险的,因为稍后派生类可以更改最左边的路径,从而更改构造和析构的顺序。
非虚拟基类
按照相反的顺序(按此顺序声明基类名称)调用非虚拟基类的析构函数。考虑下列类声明:
class MultInherit : public Base1, public Base2
...
在前面的示例中,先于 Base2 的析构函数调用 Base1 的析构函数。
显式析构函数调用
很少需要显式调用析构函数。但是,对置于绝对地址的对象进行清理会很有用。这些对象通常使用采用位置参数的用户定义的 new 运算符进行分配。 delete 运算符不能释放该内存,因为它不是从自由存储区分配的(有关详细信息,请参阅 new 和 delete 运算符)。但是,对析构函数的调用可以执行相应的清理。若要显式调用 s 类的对象 String 的析构函数,请使用下列语句之一:
s.String::~String(); // Nonvirtual call
ps->String::~String(); // Nonvirtual call
s.~String(); // Virtual call
ps->~String(); // Virtual call
可以使用对前面显示的析构函数的显式调用的表示法,无论类型是否定义了析构函数。这允许您进行此类显式调用,而无需了解是否为此类型定义了析构函数。显式调用析构函数,其中未定义的析构函数无效。
注:相关教程知识阅读请移步到C++教程频道。










