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