前言:
c++ 抽象類爲什麼要實現虛析構?
這個問題是面試官經常會問的 可能c++基礎不紮實的會懵逼 連什麼是抽象類都不清楚
什麼是抽象類?
先看一下抽象類的定義
抽象類:聲明瞭純虛函數的類,都成爲抽象類
主要特點:抽象類只能作爲基類來派生新類,不能聲明抽象類的對象。(既然都是一個抽象概念了,純虛函數沒有具體實現方法,故不能創造該類的實際的對象)
什麼又是純虛函數?
形式:virtual 函數原型=0;
定義:在定義一個表達抽象概念的基類時,有時無法給出某些函數的具體實現方法,就可以將這些函數聲明爲純虛函數。
特點:無具體實現方法。
下面這個就是抽象類
/// 抽象的汽車類 ///
class abstractCar
{
public:
virtual void name() = 0; /// 純虛函數 不做具體的實現
virtual void price()= 0; /// 純虛函數
};
要詳細瞭解抽象類移步其他文章 這裏不多解釋,主要看抽象類爲什麼要實現虛析構
看下面的代碼
/// 抽象的汽車類 ///
class abstractCar
{
public:
virtual void name() = 0;
virtual void price()= 0;
~abstractCar()
{
cout << "~abstractCar" << endl;
}
};
/// 派生寶馬類 ////
class bmw : public abstractCar
{
public:
void name()
{
std::cout << " i am bmw" << std::endl;
}
void price()
{
std::cout << " price : 500000" << std::endl;
}
~bmw()
{
cout << "~ bmw " << endl;
}
};
int main()
{
abstractCar* car = new bmw();
car->price();
car->name();
delete car;
return 0;
}
這裏我們實現了抽象的汽車類 然後寫了派生寶馬類繼承這個抽象類 實現多肽
動態多肽是在運行時才選擇的
abstractCar* car = new bmw();
理論上 應該是 先基類的構造 派生類的構造
然後 delete 以後 是先派生類的析構 在 基類的析構
delete 以後沒有執行 派生寶馬類的 析構 爲什麼?
這樣就導致內存泄露了
當他們刪除它時,如果析構函數是非虛擬的,他們將調用接口的析構函數(或者編譯器提供的默認值,如果沒有指定),而不是調用派生類的析構函數。
我們這個裏改一下代碼 把基類的析構 改爲虛析構
這樣就可以了
我看網上很多人爭論說 要不要實現虛析構 視情況而定 這個不實現也沒問題, 這裏就不參加爭論了
我們只是說 c++ 抽象類爲什麼要實現虛析構?
因爲不實現會照成 析構時 子類不析構 照成內存泄露