看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《d630200x (DOGE)》之銘言: : 我對virtual的理解是將該函式宣告為可override : 應該是類似對其產生function pointer,使得可以依據實際型態執行對應的function : 但是我無法理解為何base class desturctor也需要宣告virtual : 照理來說base與derived的刪除應該互不相關才對 : derived先把自己刪除,base再刪除自己 : 為何變成指標後base不宣告virtual後derived就不會被執行了? : ----- : Sent from JPTT on my Asus ASUS_I01WD. 這是為了確保在多形狀況的 delete 可以呼叫到 正確的 derived class 的 destructor. 否則當你用 base class 的 pointer 來接受 new 來的 derived object 時,當你 delete 這個 object 時,編譯器會只呼叫到 base class 的 destructor 因為根據 base class 的宣告,它的 destructor 不是 virtual,不需要去 virtual table 裡面找。 因為難以用三言兩語說清楚,有興趣可以參考 inside C++ object model 的內容 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.204.7.185 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1609778849.A.BDA.html ※ 編輯: charleshu (123.204.7.185 臺灣), 01/05/2021 00:50:05 ※ 編輯: charleshu (123.204.7.185 臺灣), 01/05/2021 00:52:49
loveme00835: 在 resolve function call 的時候並沒有 vtable 的觀 01/05 01:44
loveme00835: 念 [expr.call] 3. 如果看到 virtual 編譯器就要去 v 01/05 01:44
loveme00835: table 找實體那就無法解釋 [class.cdtor] 4 的行為. 01/05 01:44
loveme00835: 你這是從實作來理解語言設計 01/05 01:44