2014-02-18 50 views
2

是否需要將C++析構函數定義爲虛擬?如果是這樣,爲什我已經讀過,他們需要確保在將基類指針轉換爲派生類時進行適當的清理。是否需要定義一個虛擬析構函數?

+1

不需要,但強烈推薦。 –

+0

你能詳細說明一下嗎?一個例證會很棒。 – bblincoe

回答

4

需要虛擬析構函數來允許將析構函數調用動態分派到層次結構樹中的相應類。

在其中,你有一個情況:

Base *d = new Derived(); 
delete d; 

沒有virtual析構函數,你有不確定的操作。這是因爲編譯器無法找到Derived最專業的析構函數,因爲它沒有被聲明爲virtual

2

它不是正式需要的 - 你可以很容易地編譯一個具有虛函數的類,但不是一個虛擬析構函數,但這是不明智的。

想象一下,您有一個基類A和兩個派生類B和C.B和C具有不同的字段,並且需要在析構函數中進行不同的清理。

現在您分配

A *p = new B(); 

然後,當你調用

delete p; 

,編譯器將不知道調用哪個析構函數(其實這是根據C++標準未定義的行爲)。

如果你不定義虛析構函數中,只有A的析構函數可以調用,這是不是在我們的假設B類

充足的情況下如果你從來沒有用new關鍵字實例化類(之後它delete它),你不需要一個虛擬析構函數。但是,添加虛擬析構函數不會影響性能,所以最好始終提供它。

相關問題