使用多態時,如果子類中有屬性開闢到堆區,那麼父類指針在釋放時無法調用到子類的析構代碼
解決:將父類中的析構函數改爲虛析構或者純虛析構
虛析構和純虛析構
共性:1.可以解決父類指針釋放子類對象
2.都需要有具體的函數實現
區別:如果是純虛析構,該類屬於抽象類,無法實例化對象
虛析構語法
virtual ~類名(){}
純虛析構語法
virtual ~類名()=0;
類名::~類名(){}
#include<iostream>
using namespace std;
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)
{
cout<<"Cat的構造函數調用"<<endl;
m_Name=new string(name);
}
virtual void speak()
{
cout<<*m_Name<<"在說話"<<endl;
}
~Cat()
{
cout<<"Cat的析構函數調用"<<endl;
if(m_Name!=NULL)
delete m_Name;
m_Name=NULL;
}
string *m_Name;
};
void test()
{
Animal *animal=new Cat("Tom");
animal->speak();
//父類指針在析構時候,不會調用子類中的析構函數,導致子類如果有堆區屬性,出現內存泄漏
delete animal;
}
int main()
{
test();
}