在继承的时候除了构造函数无法被继承外,析构函数也是无法被继承的。
但是,和构造函数不同,析构析构实在函数的结束的时候调用的。构造是谁先创建谁就先调用,但是析构是谁先释放谁就先调用。
如下:
#include <iostream>
using namespace std;
class Animal {
public:
~Animal() {
cout << "~Animal" << endl;
}
};
class Dog :public Animal {
public:
~Dog() {
cout << "~Dog" << endl;
}
};
int main() {
Dog dog;
return 0;
}
如上,通过上面的方法为子类Dog实例化,在进行创建的时候,会优先创建一个父类,再创建一个子类,但是释放的时候就不同。释放的时候是先释放子类再释放父类。就是说dog对象在main函数调用结束后,会先调用Dog类本身的析构函数,然后再调用父类的析构函数。
除此之外,再看一种情况,如下:
#include <iostream>
using namespace std;
class Animal {
public:
~Animal() {
cout << "~Animal" << endl;
}
};
class Dog :public Animal {
public:
~Dog() {
cout << "~Dog" << endl;
}
};
class Cat :public Animal {
public:
~Cat() {
cout << "~Cat" << endl;
}
};
int main() {
Dog dog;
Cat cat;
return 0;
}
在上述代码中,除了Dog类继承了Animal外,Cat类也继承了Animal类。但是最后运行代码时会发现,系统优先调用了cat的析构函数。
在C/C++学习阶段,有着内存四区的说法。其中,函数中的临时变量存储在栈区,栈区具有先进后出,后进先出的特点。在main中,cat是在dog后面创建的。因此,会优先释放cat对象,所以,会优先调用cat类的析构函数。