Re: [問題] 為何多型物件的解構子要用virtual?

看板C_and_CPP作者 (即興的人生最美)時間3年前 (2021/01/05 00:47), 3年前編輯推噓0(004)
留言4則, 1人參與, 3年前最新討論串2/2 (看更多)
※ 引述《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

01/05 01:44, 3年前 , 1F
在 resolve function call 的時候並沒有 vtable 的觀
01/05 01:44, 1F

01/05 01:44, 3年前 , 2F
念 [expr.call] 3. 如果看到 virtual 編譯器就要去 v
01/05 01:44, 2F

01/05 01:44, 3年前 , 3F
table 找實體那就無法解釋 [class.cdtor] 4 的行為.
01/05 01:44, 3F

01/05 01:44, 3年前 , 4F
你這是從實作來理解語言設計
01/05 01:44, 4F
文章代碼(AID): #1VyqQXlQ (C_and_CPP)
文章代碼(AID): #1VyqQXlQ (C_and_CPP)