要使用多态特性时,基类析构函数需要加上virtual关键字,调用对基类指针的delete时才会发生动态绑定,使派生类的析构函数也能够被调用到,否则只调用的基类的析构函数,没有调用派生类的析构函数,导致内存泄漏。
基类析构函数声明virtual不是必需的,若确定不需要使用到基类指针指向派生类的多态特性(但是可能会给协作代码的人带来坑),继承的类不需要将析构函数加上virtual。
另一种防止内存泄漏方法是把基类的析构函数放在protected的权限里面:
#include <iostream>
using namespace std;
class Base {
public:
Base() {
cout << typeid(Base).name() << "构造成功!" << endl;
}
protected:
~Base() {
cout << typeid(Base).name() << "析构成功!" << endl;
}
};
class Son_Base :public Base {
public:
Son_Base() {
cout << typeid(Son_Base).name() << "构造成功!" << endl;
}
~Son_Base() {
cout << typeid(Son_Base).name() << "析构成功!" << endl;
}
};
void testBase() {
//Base b; //不通过
//Base* p = new Base; //通过
//delete p; //不通过
//Son_Base s; //通过
//Son_Base* p = new Son_Base; //通过
//delete p; //通过
//Base* p = new Son_Base; //通过
//delete p; //不通过
}
int main() {
testBase();
cin.get();
}
上述代码只有派生类指针指向派生类的实例才能正确的申请和释放,这种方法同样可以实现在派生类函数内调用基类函数,但是不能通过调用基类指针指向派生类实例的方法实现多态。