通过父类指针去释放,会导致子类对象可能清理不干净,造成内存泄漏
怎么解决?给基类增加一个虚析构函数
虚析构函数就是用来解决通过父类指针释放子类对象
多态如果使用引用方法即可避免上述问题!
#include"inherit_09.h"
class AnimalC
{
public:
AnimalC()
{
cout << "call AnimalC" << endl;
}
// 方法1:虚构函数
//virtual ~AnimalC()
//{
// cout << "call ~AnimalC(虚析构函数)" << endl;
//}
// 方法2 纯虚析构函数,!!! 除了声明外还需要在外部写函数体 !!!!!
// 和包含普通纯虚函数的类一样,包含了纯虚析构函数的类也是一个抽象类。不能够被实例化
virtual ~AnimalC() = 0;
virtual void spead() = 0;
};
AnimalC::~AnimalC()
{
cout << "call ~AnimalC(纯虚析构函数)" << endl;
}
class CatC:public AnimalC
{
public:
CatC(string name)
{
// 开辟堆空间
this->name = new string(name);
cout << "call CatC" << endl;
}
~CatC()
{
cout << "call ~CatC" << endl;
if (this->name != NULL)
{
delete this->name;
this->name = NULL;
}
}
virtual void spead()
{
cout << *name << "小猫在说话!" << endl;
}
string* name;
};
// 动画在说话(实现多态)
void animal_spead(AnimalC& obj)
{
obj.spead();
}
//引用方法 引用方法不会有指针方法导致子类对象可能清理不干净的情况
//call AnimalC
//call CatC
//TOM小猫在说话!
//call ~CatC
//call ~AnimalC
void inherit_09_reference()
{
cout << "引用方法" << endl;
CatC cat("TOM");
animal_spead(cat);
}
//指针方法 (缺少调用子类的析构函数)
//call AnimalC
//call CatC
//Tom小猫在说话!
//call ~AnimalC
void inherit_09_pointer()
{
cout << "\n指针方法" << endl;
AnimalC* cat = new CatC("Tom");
cat->spead();
// 通过父类指针去释放,会导致子类对象可能清理不干净,造成内存泄漏
// 在父类增加虚构函数即可
delete cat;
}