C++ 多態(三) 虛析構和純虛析構

爲神魔要用虛析構(純虛析構)?

父類指針在析構時不會調用子類析構函數,這會使得子類中堆區內存無法釋放,從而導致內存泄漏。

虛析構語法:

virtual ~類名(參數列表){
		具體實現
}

純虛構語法:

virtual ~類名(參數列表)=0;

類名::~類名(參數列表){
具體實現
}

虛構函數與純虛構函數的共性

  • 都可以解決父類指針釋放子類對象
  • 都必須有具體函數實現

虛構函數與純虛構函數的區別

  • 存在虛函數的類爲抽象類

如果子類不存在堆區數據可以不寫虛析構(純虛析構)

#include<iostream>
#include<string>
using namespace std;

class animal {

public:
	virtual void speak() = 0;//純虛函數
	virtual ~animal() = 0;
};
animal::~animal() {
	cout << "我是動物的析構函數" << endl;
}

class Dog :public animal {
public:
	Dog(string dog) {
		this->dog = new string(dog);
	}

	string *dog;
	void speak() {
		cout <<"我是"<< *dog<<"汪汪汪!" << endl;
	}
	~Dog() {
		cout << "我是哼嘟,我要被析構了,再見,我其實有點後悔,當初我來到家的時候很快樂,我走了,你要開心歐,下輩子我不當狗狗了,因爲我想在藍天下自由的奔跑,但是我真的不想走啊!" << endl;
	}
};



int main() {

	
	animal* f1 =new Dog("哼嘟"); //有誰還記得這隻狗呢?
	f1->speak();//我是哼嘟,汪汪汪!
	delete f1;
	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章