虚析构
- 当使用delete释放一个父类指针时,不管实际指向的对象是子类还是父类,都只会调用父类的析构函数(多态肯定会出现的问题)
- 如果子类的析构函数有需要释放的内存,就会造成内存泄漏
- 为了解决这个问题,可以把父类的析构函数设置为虚函数(析构函数进行覆盖时不会比较函数名)
- 当父类的析构函数为虚函数时,通过父类指针或引用释放子类对象时会自动调用子类的析构函数,子类对象的析构函数执行完成后也会调用父类的析构函数
- 注意 析构函数可以是虚函数,但构造函数不行
#include <iostream>
using namespace std;
class Base
{
public:
Base(void)
{
}
virtual ~Base(void)
{
cout << "我是父类析构函数" << endl;
}
};
class Test:public Base
{
public:
Test(void)
{
}
~Test(void)
{
cout << "我是子类析构函数" << endl;
}
};
int main()
{
Base* p = new Test;
delete p;
}
运行结果
我是子类析构函数
我是父类析构函数