為什么有了虛析構(gòu)函數(shù),就能先調(diào)用子類的析構(gòu)函數(shù)
虛函數(shù)表的理論已經(jīng)大概明白了,但是還是搞不懂,在有虛析構(gòu)函數(shù)的情況下,為什么delete父類的指針,會(huì)先找到子類的析構(gòu)函數(shù)。
如果是一般的虛函數(shù),因?yàn)楦割惡妥宇惖暮瘮?shù)名字都是一樣的,調(diào)用該函數(shù)的時(shí)候,通過虛函數(shù)表,就會(huì)找到子類的函數(shù)地址,調(diào)用相應(yīng)的函數(shù)。
但是虛析構(gòu)函數(shù),父類和子類的函數(shù)名字是不同的,這樣我就想不明白了,delete父類的指針,應(yīng)該會(huì)去找父類的析構(gòu)函數(shù)啊,怎么會(huì)先去子類的虛函數(shù)表中找到子類的析構(gòu)函數(shù)呢?
2020-06-18
兄弟我在網(wǎng)上看到一種說法,可以解決你的疑惑
總結(jié):虛析構(gòu)函數(shù)的地址存在于虛函數(shù)表中,和普通虛函數(shù)別無二致,同時(shí)也會(huì)像普通的虛函數(shù)一樣進(jìn)行覆蓋
雖然父子的析構(gòu)函數(shù)名字不一樣,但是他們占同一個(gè)坑(即父子析構(gòu)函數(shù)在虛函數(shù)表中的位置是一樣的,否則就不存在多態(tài)了)
析構(gòu)時(shí),到特定的坑中調(diào)用該類型的析構(gòu)函數(shù),其析構(gòu)函數(shù)中又嵌套了很多對(duì)父類的析構(gòu)函數(shù)的調(diào)用
————————————————
版權(quán)聲明:本文為CSDN博主「F_cff」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/F_cff/article/details/79690470
2020-06-18
兄弟,你的問題我也很疑惑, 子類的虛函數(shù)表應(yīng)該包含父類的虛析構(gòu)函數(shù)和子類的虛擬構(gòu)函數(shù), 為啥delete的時(shí)候調(diào)的是子類的虛析構(gòu)函數(shù)呢, 網(wǎng)上的說法都沒說清楚, 你現(xiàn)在懂了嘛
2020-06-18
個(gè)人理解:CFather *p = new CSon;? 父類指針p前四個(gè)字節(jié)里面裝的是虛指針的地址,如果父類有虛析構(gòu),那么該指針指向的虛函數(shù)列表里第一個(gè)元素就是子類的析構(gòu)函數(shù),當(dāng)delete p;時(shí),先進(jìn)入虛函數(shù)列表當(dāng)中執(zhí)行第一個(gè)元素,即子類析構(gòu)函數(shù),接著再去執(zhí)行父類本身的析構(gòu)函數(shù)。查看子類虛函數(shù)列表當(dāng)中的元素可以通過如下方式:
pFun pfun =? (pFun)*((int *)*(int *)p + 0);
2017-05-09
問題是兩個(gè)指針地址值不一樣,析構(gòu)的時(shí)候,父類怎么回去尋找得到子類去析構(gòu)呢?有的話,應(yīng)該父類應(yīng)該要存有子類析構(gòu)函數(shù)的地址啊
2016-08-28
我的理解:因?yàn)楦割愔羔樦赶虻氖亲宇惖膶?duì)象,因?yàn)橹羔樦赶虻亩际鞘椎刂?,而子類?duì)象的首地址也是虛函數(shù)表的位置,所以這個(gè)父類指針就找到了子類對(duì)象的虛函數(shù)表,進(jìn)而找到虛析構(gòu)函數(shù)。
2016-08-06
我覺得是這樣:
虛析構(gòu)函數(shù),delete父類的指針p,程序會(huì)去找父類的指針p指向的地址,該地址就是子類頭部虛函數(shù)表指針的地址,由指針p找到子類的虛函數(shù)表,從而找到子類的虛析構(gòu)函數(shù)。
2016-07-18
虛函數(shù)有動(dòng)態(tài)關(guān)聯(lián)的功能,如果調(diào)用基類中的析構(gòu)函數(shù),而子類中的析構(gòu)函數(shù)卻沒有被調(diào)時(shí),如果自類中有自己的在“堆”上開辟的空間的話,而恰好是在子類的析構(gòu)函數(shù)中完成內(nèi)存回收的話,這樣就會(huì)因?yàn)闆]有執(zhí)行到子類的析構(gòu)函數(shù),而導(dǎo)致內(nèi)存泄漏。所以,析構(gòu)函數(shù)與構(gòu)造函數(shù)相反,系統(tǒng)會(huì)首先執(zhí)行子類的析構(gòu)函數(shù),再執(zhí)行父類的析構(gòu)函數(shù)。