c++從入門到精通——普通析構、虛析構、純虛析構

虛析構和純虛析構

普通析構

#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的純虛析構調用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章