我已經有了一個場景,我正在編寫一些有深度面向對象的代碼,有多個抽象基類的圖層,我想知道是否必須爲每一個顯式聲明一個析構函數。使用虛擬析構函數,我需要爲每個子類明確聲明一個虛擬析構函數嗎?
編譯器會生成一個已經是虛擬的默認的,還是我必須告訴它?
我已經有了一個場景,我正在編寫一些有深度面向對象的代碼,有多個抽象基類的圖層,我想知道是否必須爲每一個顯式聲明一個析構函數。使用虛擬析構函數,我需要爲每個子類明確聲明一個虛擬析構函數嗎?
編譯器會生成一個已經是虛擬的默認的,還是我必須告訴它?
默認析構函數不是虛擬的,但如果將基類的析構函數聲明爲虛函數,則子類的析構函數將會覆蓋,因此即使沒有明確聲明它們也是虛函數。
如果你有一個類層次結構,並且你的基類沒有聲明析構函數是虛擬的,那麼GNU GCC編譯器甚至會給出一個警告,因爲你很可能想要它。
答案是否定的。這裏唯一相關的要求是具有虛表(,即,至少有一個虛函數)的類必須在其繼承鏈中的某處至少有一個虛析構函數。通常這意味着你的基礎類將提供一個空的虛擬析構函數。
我注意到,在下面的註釋中,您還會問是否需要爲每個子類_define_析構函數。答案是否定的。 – 2013-06-14 20:47:58