c++ 抽象類爲什麼要實現虛析構?

前言:

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++ 抽象類爲什麼要實現虛析構?
因爲不實現會照成 析構時 子類不析構 照成內存泄露

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章