#include<iostream>
#include<string>using namespace std;//虛析構和純虛析構
class Animal
{
public:Animal(){cout<<"執行Animal的構造函數"<<endl;}~Animal(){cout<<"執行Animal的析構函數"<<endl;}virtual void speak()=0;
};
class Cat:public Animal
{
public:string* m_Name;Cat(string name){cout<<"執行Cat的構造函數"<<endl;// new string(name)是在堆區創建一個內容為name的字符層,并返回該字符層的指針。m_Name = new string(name);}virtual void speak(){cout<<*m_Name<<"小貓在說話"<<endl;}~Cat(){if(m_Name!=NULL){cout<<"執行Cat的析構函數"<<endl;delete m_Name;m_Name = NULL;}}
};
void test01()
{Animal* animal = new Cat("Tom");animal->speak();delete animal;
}int main()
{test01();
}
發現程序沒有調用子類Cat的析構函數。
因為我們用父類的指針指向子類Cat,當delete animal;時,父類調用自己的析構函數并不會執行子類的析構函數。
導致子類如果有堆區屬性,會出現內存泄漏。
解決方法把父類的析構函數改為虛西狗。
虛析構
virtual ~Animal(){cout<<"執行Animal的析構函數"<<endl;}
純虛析構
virtual ~Animal() = 0;
運行之后報錯,因為純虛析構只是聲明,沒有實現。
#include<iostream>
#include<string>using namespace std;//虛析構和純虛析構
class Animal
{
public:Animal(){cout<<"執行Animal的構造函數"<<endl;}virtual ~Animal() = 0;virtual void speak()=0;
};class Cat:public Animal
{
public:string* m_Name;Cat(string name){cout<<"執行Cat的構造函數"<<endl;// new string(name)是在堆區創建一個內容為name的字符層,并返回該字符層的指針。m_Name = new string(name);}virtual void speak(){cout<<*m_Name<<"小貓在說話"<<endl;}~Cat(){if(m_Name!=NULL){cout<<"執行Cat的析構函數"<<endl;delete m_Name;m_Name = NULL;}}};void test01()
{Animal* animal = new Cat("Tom");animal->speak();delete animal;
}Animal::~Animal()
{cout<<"執行Animal的析構函數"<<endl;
}int main()
{test01();
}