C++中爲什麼析構函數是虛函數

如果基類的析構函數不是虛函數,在特定情況下會導致派生來無法被析構。

情況1:用派生類類型指針綁定派生類實例,析構的時候,不管基類析構函數是不是虛函數,都會正常析構

情況2:用基類類型指針綁定派生類實例,析構的時候,如果基類析構函數不是虛函數,則只會析構基類,不會析構派生類對象,從而造成內存泄漏。爲什麼會出現這種現象呢,個人認爲析構的時候如果沒有虛函數的動態綁定功能,就只根據指針的類型來進行的,而不是根據指針綁定的對象來進行,所以只是調用了基類的析構函數;如果基類的析構函數是虛函數,則析構的時候就要根據指針綁定的對象來調用對應的析構函數了。

上一篇文章說到,虛函數在派生類和基類中需要函數名字和參數表都相同,但是這裏的虛析構函數顯然在每個類中是不一樣的,可能是析構函數比較特殊吧。另外構造函數不可以是虛函數,爲什麼呢,因爲類的虛函數表指針是在構造函數中初始化的,這時候入股構造函數本身是虛函數,有應該有誰來初始化它的虛函數指針呢,所以構造函數不能是虛函數。構造函數和析構函數中也不能調用虛函數,調用了也沒用,一個是虛函數表指針還沒有初始化好,一個是可能虛函數已經被析構了。

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