c++ 構造函數能否為虛函數?析構函數能為虛函數?

構造函數不能為虛函數:

下面咱們來聊聊為什麼構造函數不能為虛函數:首先 c++對象構造過程,c++對象在三個地方構建 1)函數堆棧 2)堆 3)靜態存儲區;無論在哪裡構建其過程都是兩步:首先分配一塊內存;其次調用構造函數。假如構造函數 是虛函數那麼就需要通過虛表來調用 但此時面對的是一個raw memeory.怎麼找虛表呢,畢竟虛表是在構造函數中才初始化的,而不是在其之前,所以構造函數不能為虛函數。


析構函數可以是虛函數:

到了析構函數這裡,因為已經有了虛表,況且我們經常通過基類的指針來銷燬對象

如果析構函數不為虛函數的話就不能正確識別對象類型從而不能正確銷燬對象。

下面說下銷燬流程。在多態的時候,比如基類的指針指向了派生類對象,如果刪除

該指針delete this 就會調用該指針指向的派生類的析構函數,而派生類的析構函數又

自動調用基類的析構函數,這樣整個派生類對象完全釋放,如果析構函數不被聲明成虛函數

會造成派生類對象析構不完全。


c++ 構造函數能否為虛函數?析構函數能為虛函數?


分享到:


相關文章: