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

看板C_and_CPP (C/C++)作者 (DOGE)時間4年前 (2021/01/04 23:57), 編輯推噓1(1010)
留言11則, 2人參與, 4年前最新討論串1/2 (看更多)
我對virtual的理解是將該函式宣告為可override 應該是類似對其產生function pointer,使得可以依據實際型態執行對應的function 但是我無法理解為何base class desturctor也需要宣告virtual 照理來說base與derived的刪除應該互不相關才對 derived先把自己刪除,base再刪除自己 為何變成指標後base不宣告virtual後derived就不會被執行了? ----- Sent from JPTT on my Asus ASUS_I01WD. -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 49.214.227.83 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1609775865.A.92A.html

01/05 00:12, 4年前 , 1F
這和你要不要透過 virtual function 來得到 dynamic
01/05 00:12, 1F

01/05 00:12, 4年前 , 2F
polymorphism 無直接關聯; 而是你會不會對指到 deriv
01/05 00:12, 2F

01/05 00:12, 4年前 , 3F
ed class 物件的 base class 指標呼叫解構子, 如果不
01/05 00:12, 3F

01/05 00:12, 4年前 , 4F
會就沒必要這樣做
01/05 00:12, 4F

01/05 00:12, 4年前 , 5F

01/05 00:12, 4年前 , 6F
tual-dtors
01/05 00:12, 6F

01/05 00:17, 4年前 , 7F
呼叫的函式實體得在編譯時期就決定好, 這會取決於你
01/05 00:17, 7F

01/05 00:17, 4年前 , 8F
呼叫時 this 指標型別以及引數型別 (如果有的話)
01/05 00:17, 8F

01/05 00:24, 4年前 , 9F
也就是說, 即使你把解構子宣告成 virtual, 編譯器也
01/05 00:24, 9F

01/05 00:24, 4年前 , 10F
還是會試著呼叫父類別的版本
01/05 00:24, 10F

01/05 11:01, 4年前 , 11F
簡而言之,這樣做能確保解構順序,所以GCC也建議你加
01/05 11:01, 11F
文章代碼(AID): #1Vyphvag (C_and_CPP)
文章代碼(AID): #1Vyphvag (C_and_CPP)