虛析構和純虛析構

 

使用多態時,如果子類中有屬性開闢到堆區,那麼父類指針在釋放時無法調用到子類的析構代碼
解決:將父類中的析構函數改爲虛析構或者純虛析構


虛析構和純虛析構
共性: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();
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章