C++中,析构函数负责在对象生存期结束时进行清理工作,不含有任何参数。
在继承中,子类的析构函数只需要负责子类自身的清理即可,并不需要给父类析构函数传递参数,也不需要显式的调用父类析构函数。换句话说,子类的析构函数和不含继承的普通类的析构函数编写方式完全相同。
在继承中,析构函数的调用顺序和构造函数的调用顺序完全相反:
- 首先,执行子类析构函数体的代码;
- 然后,执行子类成员对象所在类的析构函数;
- 最后,按照子类继承各个父类的次序,进行倒序各个父类的析构函数
例子:
下面定义了类X和类Y,二者均有析构函数;类Point继承了类X和类Y(先X后Y),如下:
class X {
public:
X() {};
~X() { printf("destroy X!!! n"); }
};
class Y {
public:
Y() {};
~Y() { printf("destroy Y!!! n"); }
};
class Point: public X, public Y {
public:
Point() {};
~Point() { printf("destroy Point n"); }
};
现在,创建Point对象,观察子类析构函数和父类析构函数的执行次序:
int main() {
{Point p; }
}
// 得到:
destroy Point
destroy Y!!!
destroy X!!!
得到的结果和前述结论相同,即继承中析构函数的执行顺序和构造函数执行顺序相反。