爲什麼析構函數總是虛函數?如果這是必要的,那麼爲什麼C++不把虛析構函數直接作爲默認值?

轉載來自:http://bbs.csdn.net/topics/50486635

問題:

爲什麼析構函數總是虛函數?如果這是必要的,那麼爲什麼C++不把虛析構函數直接作爲默認值?


答案:

編譯器總是根據類型來調用類成員函數。但是一個派生類的指針可以安全地轉化爲一個基類的指針。這樣刪除一個基類的指針的時候,C++不管這個指針指向一個基類對象還是一個派生類的對象,調用的都是基類的析構函數而不是派生類的。如果你依賴於派生類的析構函數的代碼來釋放資源,而沒有重載析構函數,那麼會有資源泄漏。

所以建議的方式是將析構函數聲明爲虛函數。如果你使用MFC,並且以CObject或其派生類爲基類,那麼MFC已經爲你做了這件事情;CObject的析構函數是虛函數。一個函數一旦聲明爲虛函數,那麼不管你是否加上virtual 修飾符,它在所有派生類中都成爲虛函數。但是由於理解明確起見,建議的方式還是加上virtual 修飾符。

C++不把虛析構函數直接作爲默認值的原因是虛函數表的開銷以及和C語言的類型的兼容性。有虛函數的對象總是在開始的位置包含一個隱含的虛函數表指針成員。如果是對於MFC類CPoint和CSize這樣的小型類,增加一個指針就增加了很多內存佔用,而且使得其內存表示和基類POINT和SIZE不一致。如果兩個類的內存表示一致,那麼這樣你可以安全地把一個類的指針或數組當作另一個類的指針或數組使用。


發佈了34 篇原創文章 · 獲贊 153 · 訪問量 81萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章