作者charleshu (即興的人生最美)
看板C_and_CPP
標題Re: [問題] 為何多型物件的解構子要用virtual?
時間Tue Jan 5 00:47:21 2021
※ 引述《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