多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码,会出现内存泄漏的问题
解决方法: 将父类中的析构函数改为虚析构或者纯虚析构
虚析构和纯虚析构共性:
- 可以解决父类指针释放子类对象
- 都需要有具体的函数实现
虚析构和纯虚析构的区别:
- 如果是纯虚析构,该类属于抽象类,无法实例化对象
案例
class Animal {
public:
Animal()
{
cout << "Animal 的构造" << endl;
}
virtual void speak()
{
cout << "动物" << endl;
}
// 虚析构函数
// virtual ~Animal()
// {
// cout << "Animal 的析构函数" << endl;
// }
// 纯虚析构函数 需要在外部有实现的函数体
// 有了纯虚析构之后,这个类也属于抽象类,无法实例化对象
virtual ~Animal() = 0;
};
Animal:: ~Animal()
{
cout << "Animal 的析构" << endl;
}
class Cat : public Animal
{
public:
Cat(string name)
{
cout << "Cat 的构造" << endl;
nName = new string(name);
}
void speak()
{ cout << *nName << " 猫" << endl; }
~Cat()
{
if (nName) {
cout << "Cat 析构" << endl;
delete nName;
nName = nullptr;
}
}
};
void test()
{
Animal *ani = new Cat("Tom");
ani->speak();
// 子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码,会出现内存泄漏的问题,需要将父类中的析构函数改为 虚析构 或者 纯虚析构
delete ani;
}