關于虛析構函數
若父類未聲明虛析構函數,這時候
父類 obj=new 子類()
delete obj//調用父類的析構,這里是找到子類的虛函數指針然后找到對應的虛函數表里面父類的析構么?
若父類聲明了虛析構,這時候
父類 obj=new 子類()
delete obj//調用子類的析構,這里是可以理解找到子類的徐函數指針,再找到虛函數表,在偏移到對應的虛析構
但是反過來理解不了第一條,求解答。
若父類未聲明虛析構函數,這時候
父類 obj=new 子類()
delete obj//調用父類的析構,這里是找到子類的虛函數指針然后找到對應的虛函數表里面父類的析構么?
若父類聲明了虛析構,這時候
父類 obj=new 子類()
delete obj//調用子類的析構,這里是可以理解找到子類的徐函數指針,再找到虛函數表,在偏移到對應的虛析構
但是反過來理解不了第一條,求解答。
2019-09-10
舉報
2019-09-10
首先有個前提,就是如果析構函數聲明為虛函數,可以依次執行子類和父類的析構函數(這個前提好像沒有看到解釋,就當做定理吧)
若父類未聲明虛析構函數,這時候
父類 *obj=new 子類()
delete obj;
你這里生成的是父類的指針,你在delete父類這個指針的時候當然是只會調用父類的析構函數,肯定無法調用到子類的析構函數啦,因為此時根本就沒有提到子類對象。但是按照上面的前提,當你聲明析構函數為虛函數的時候,如果子類構造函數中申請了內存,就可以先調用子類析構函數,把這部分內存釋放掉
若父類聲明了虛析構,這時候
父類 *obj=new 子類()
delete obj;
同理,這里也是刪除父類指針,調用的是父類的析構函數,但是因為你聲明了虛析構函數,就會先調用子類再調用父類
子類的虛函數表里面怎么會有父類析構函數呢,就只會有子類的析構函數,除非子類沒有重寫虛析構函數,才會沿用父類的虛析構函數。但是這些跟你問的內容沒有關系。原因是上面幾行,跟虛函數指針關系不大。