2011-04-10 77 views
9

我已經有了一個場景,我正在編寫一些有深度面向對象的代碼,有多個抽象基類的圖層,我想知道是否必須爲每一個顯式聲明一個析構函數。使用虛擬析構函數,我需要爲每個子類明確聲明一個虛擬析構函數嗎?

編譯器會生成一個已經是虛擬的默認的,還是我必須告訴它?

+0

我注意到,在下面的註釋中,您還會問是否需要爲每個子類_define_析構函數。答案是否定的。 – 2013-06-14 20:47:58

回答

9

默認析構函數不是虛擬的,但如果將基類的析構函數聲明爲虛函數,則子類的析構函數將會覆蓋,因此即使沒有明確聲明它們也是虛函數。

如果你有一個類層次結構,並且你的基類沒有聲明析構函數是虛擬的,那麼GNU GCC編譯器甚至會給出一個警告,因爲你很可能想要它。

+2

你可能是指析構函數,而不是構造函數。 – GManNickG 2011-04-10 06:33:58

+0

對,謝謝,修復它。 – trenki 2011-04-10 06:37:41

+1

gcc只會發出警告*如果*你有一個虛擬方法*但是*析構函數不是虛擬的。您可以完美地從一個類繼承而不需要任何虛擬方法,這對於元編程來說非常方便:) – 2011-04-10 11:02:48

2

通常,如果某些函數在基類中聲明爲虛擬的,則不需要在子類中顯式聲明它是虛擬的。但這是一個好習慣。

將子類中的析構函數聲明爲虛函數顯然不會給你任何嚴重的好處,所以如果你不想寫更多的虛函數,不要這樣做。

+0

我需要在實現中包含一個定義嗎?這會導致大量的空析構函數混淆我的代碼。 – Alex 2011-04-10 06:28:48

+0

@Alex不,你可以跳過它。 – UmmaGumma 2011-04-10 06:32:13

3

答案是否定的。這裏唯一相關的要求是具有虛表(,即,至少有一個虛函數)的類必須在其繼承鏈中的某處至少有一個虛析構函數。通常這意味着你的基礎類將提供一個空的虛擬析構函數。

相關問題