C++ --- 構造函數和析構函數能不能定義爲虛方法, 爲什麼??

A.面試常問問題之一:“析構函數能不能寫成虛函數”“析構函數什麼時候必須寫成虛函數”?大家肯定都知道答案了,來看看以下內容,再熟悉下,然後也理理思路,你雖然知道,但能不能有效的說出來,那還真不一定!
“析構函數能不能寫成虛函數?”
析構函數是可以寫成虛函數的,由於虛函數的地址是要寫在虛函數表中的,而虛函數表的地址是記錄在虛函數指針vfptr當中的,vfptr一般情況都部署在對象的前4個字節,因此,一個成員方法/函數能不能實現成虛函數,需要兩點:
1.對象已經存在了
2.函數得有地址
那麼像構造函數,inline成員函數,static成員函數等都不能定義成virtual函數,因爲析構函數調用的時候對象是存在的,因此是可以定義成虛函數的,稱爲虛析構函數。
“析構函數什麼時候必須寫成虛函數”
當使用基類的指針指向堆上的派生類對象時,如下代碼: Base *p = new Derive();delete p;
delete P;
當你通過delete想釋放派生類對象的內存時,會導致派生類對象的析構函數無法調用,只調用了基類部分的析構函數,如果此時派生類的析構函數有釋放額外系統資源的代碼,那麼就直接造成資源泄露了,問題很嚴重!因爲delete p這句代碼,編譯器在編譯的時候是進行靜態綁定的,認死理,就只調用基類的析構;如果你把基類的析構函數寫成虛析構函數,此處就是動態綁定了,由於你派生類提供了自定義的析構函數,那麼虛函數表寫的就是派生類析構函數的地址,此時派生類和基類的析構函數就都可以調用到了,解決上面提到的資源泄露的問題!

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