解决父类无法释放子类的堆区内存问题。
注意:纯虚析构无法实例化
虚析构和纯虚析构
多态使用时,如果子类有对象开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码
解决方式:将父类中的析构函数改为虚析构或者纯虚析构
虚析构和纯虚析构的共性:
可以解决父类指针释放子类对象
都需要有具体的函数实现
虚析构和纯虚析构的区别:
如果是纯虚析构,该类属于抽象类,无法实例化对象
#include<stdio.h>
#include <iostream>
#include<string>
using namespace std;
class Animal
{
public:
Animal()
{
cout << "Animal构造函数调用" << endl;
}
//virtual ~Animal()
//{
// cout << "Animal析构函数调用" << endl;
// //父类指针把子类删干净,虚析构
//}
Animal::~Animal()
{
cout << "Animal析构函数调用" << endl;
}
virtual void speak() = 0;
//纯虚函数
};
class Cat:public Animal
{
public:
Cat(string name) {
m_Name = new string(name);
if (m_Name != NULL)
{
cout << "cat析构调用" << endl;
//animal->speak();
delete m_Name;
m_Name = NULL;
}
}
virtual void speak()
{
cout << *m_Name<<"cat is speaking!"<< endl;
}
string* m_Name;
};
void test01() {
Animal* animal = new Cat("Tom");
animal->speak();
//父类指针析构时不会调用子类的析构函数,导致子类中堆区出现内存泄露(如果子类堆区有东西)
delete animal;
}
int main()
{
test01();
}