如果基類的析構函數不是虛函數,在特定情況下會導致派生來無法被析構。
情況1:用派生類類型指針綁定派生類實例,析構的時候,不管基類析構函數是不是虛函數,都會正常析構
情況2:用基類類型指針綁定派生類實例,析構的時候,如果基類析構函數不是虛函數,則只會析構基類,不會析構派生類對象,從而造成內存泄漏。爲什麼會出現這種現象呢,個人認爲析構的時候如果沒有虛函數的動態綁定功能,就只根據指針的類型來進行的,而不是根據指針綁定的對象來進行,所以只是調用了基類的析構函數;如果基類的析構函數是虛函數,則析構的時候就要根據指針綁定的對象來調用對應的析構函數了。
上一篇文章說到,虛函數在派生類和基類中需要函數名字和參數表都相同,但是這裏的虛析構函數顯然在每個類中是不一樣的,可能是析構函數比較特殊吧。另外構造函數不可以是虛函數,爲什麼呢,因爲類的虛函數表指針是在構造函數中初始化的,這時候入股構造函數本身是虛函數,有應該有誰來初始化它的虛函數指針呢,所以構造函數不能是虛函數。構造函數和析構函數中也不能調用虛函數,調用了也沒用,一個是虛函數表指針還沒有初始化好,一個是可能虛函數已經被析構了。