爲神魔要用虛析構(純虛析構)?
父類指針在析構時不會調用子類析構函數,這會使得子類中堆區內存無法釋放,從而導致內存泄漏。
虛析構語法:
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;
}