虛析構和純虛析構
普通析構
#include<iostream>
#include<cstring>
using namespace std;
class Animal
{
public:
virtual void speak()
{
cout << "動物在說話" << endl;
}
//普通析構 是不會調用子類的析構的,所以可能會導致釋放不乾淨
~Animal()
{
cout << "Animal的析構調用" << endl;
}
};
class Cat:public Animal
{
public:
Cat(const char * name)
{
this->m_Name = new char[strlen(name) + 1];
strcpy(this->m_Name, name);
}
virtual void speak()
{
cout << "小貓在說話" << endl;
}
~Cat()
{
cout << "Cat的析構調用" << endl;
if (this->m_Name !=NULL)
{
delete[] this->m_Name;
this->m_Name = NULL;
}
}
char * m_Name;
};
void test01()
{
Animal * animal = new Cat("TOM");
animal->speak();
delete animal;
}
int main(){
test01();
return 0;
}
運行
小貓在說話
Animal的析構調用
可以看到,Cat對象的析構沒有調用。
虛析構
在普通析構的基礎上添加virtual關鍵字
//普通析構 是不會調用子類的析構的,所以可能會導致釋放不乾淨
//利用虛析構來解決這個問題
virtual ~Animal()
{
cout << "Animal的析構調用" << endl;
}
運行
小貓在說話
Cat的析構調用
Animal的析構調用
純虛析構
純虛析構 ,需要聲明 還需要實現 類內聲明,類外實現
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
using namespace std;
class Animal
{
public:
virtual void speak()
{
cout << "動物在說話" << endl;
}
//純虛析構 寫法如下
//純虛析構 ,需要聲明 還需要實現 類內聲明,類外實現
virtual ~Animal() = 0;
};
//純虛析構函數實現
Animal::~Animal()
{
cout << "Animal的純虛析構調用" << endl;
}
class Cat:public Animal
{
public:
Cat(const char * name)
{
this->m_Name = new char[strlen(name) + 1];
strcpy(this->m_Name, name);
}
virtual void speak()
{
cout << "小貓在說話" << endl;
}
~Cat()
{
cout << "Cat的析構調用" << endl;
if (this->m_Name !=NULL)
{
delete[] this->m_Name;
this->m_Name = NULL;
}
}
char * m_Name;
};
void test01()
{
Animal * animal = new Cat("TOM");
animal->speak();
delete animal;
}
int main(){
test01();
return 0;
}
運行
小貓在說話
Cat的析構調用
Animal的純虛析構調用