先说结论:一个类作为基类时,最好把析构函数定义成虚函数。否则,当用基类指针指向派生类情况下,释放基类指针,派生类的析构函数不会被调用,这样就有可能造成资源或者内存泄漏等问题。
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
// 基类
class Parent {
public:
Parent() { cout << "Parent()" << endl; };
virtual ~Parent() {
cout << "~Parent()" << endl;
}
};
// 派生类
class Child :public Parent {
public:
Child() {
cout << "Child()" << endl;
}
~Child() {
cout << "~Child()" << endl;
}
};
int main() {
Parent* obj = new Child;
delete obj;
return 0;
}
~Parent()定义成虚函数,则会调用~Child()。不定义成虚函数,不会调用~Child()。
如果把Parent* obj = new Child;改成Child* obj = new Child; 然后delete obj,不管~Parent()是不是虚函数都会调用~Child()。
上面的几种情况,大家可以自己测试一下。