虚析构和纯虚析构的共性:
1、可以解决父类指针释放子类对象的问题
2、都需要具体的函数实现
二者区别:
拥有纯虚析构的累属于抽象类,无法实例化对象
PS:
1、虚析构函数或纯虚析构函数就是用来实现 父类指针释放子类对象 的作用
2、若子类中没有堆区数据,可以不写虚析构和纯虚析构
想说的都在代码中
#include<iostream>
using namespace std;
#include<string>
class Animal
{
public:
virtual void speak() = 0;
Animal()
{
cout <<"Animal 的构造函数" <<endl;
}
//虚析构
//利用虚析构可以解决 父类指针释放子类对象不干净的问题
// virtual ~Animal()
// {
// cout <<"Animal 的析构函数" <<endl;
// }
//纯虚析构 与虚析构都需要有具体的实现
//有了纯虚析构之后 这个类也属于抽象类 无法实例化对象
virtual ~Animal() = 0;
};
Animal::~Animal()
{
cout <<"Animal 的析构函数" <<endl;
}
class Cat:public Animal
{
public:
Cat(string name)
{
m_Name = new string(name);
cout <<"Cat的构造函数"<<endl;
}
void speak()
{
cout<<*m_Name<<" Cat speaks"<<endl;
}
~Cat()
{
if(m_Name!=NULL)
{
cout <<"Cat 的析构函数"<<endl;
delete m_Name;
m_Name=NULL;
}
}
string *m_Name;
};
void test01()
{
Animal *animal = new Cat("Tom");
animal->speak();
//通过父类指针释放,导致子类的堆区数据不能被清理干净,造成内存泄露,
//即不走子类对象的析构函数
//通过虚析构父类函数解决问题
//父类指针释放子类对象
delete animal;
}
int main()
{
test01();
return 0;
}