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