第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

為什么有了虛析構(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ù)呢?

正在回答

7 回答

兄弟我在網(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


0 回復(fù) 有任何疑惑可以回復(fù)我~

兄弟,你的問題我也很疑惑, 子類的虛函數(shù)表應(yīng)該包含父類的虛析構(gòu)函數(shù)和子類的虛擬構(gòu)函數(shù), 為啥delete的時(shí)候調(diào)的是子類的虛析構(gòu)函數(shù)呢, 網(wǎng)上的說法都沒說清楚, 你現(xiàn)在懂了嘛

0 回復(fù) 有任何疑惑可以回復(fù)我~

個(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);

0 回復(fù) 有任何疑惑可以回復(fù)我~

問題是兩個(gè)指針地址值不一樣,析構(gòu)的時(shí)候,父類怎么回去尋找得到子類去析構(gòu)呢?有的話,應(yīng)該父類應(yīng)該要存有子類析構(gòu)函數(shù)的地址啊

0 回復(fù) 有任何疑惑可以回復(fù)我~

我的理解:因?yàn)楦割愔羔樦赶虻氖亲宇惖膶?duì)象,因?yàn)橹羔樦赶虻亩际鞘椎刂?,而子類?duì)象的首地址也是虛函數(shù)表的位置,所以這個(gè)父類指針就找到了子類對(duì)象的虛函數(shù)表,進(jìn)而找到虛析構(gòu)函數(shù)。

0 回復(fù) 有任何疑惑可以回復(fù)我~

我覺得是這樣:

虛析構(gòu)函數(shù),delete父類的指針p,程序會(huì)去找父類的指針p指向的地址,該地址就是子類頭部虛函數(shù)表指針的地址,由指針p找到子類的虛函數(shù)表,從而找到子類的虛析構(gòu)函數(shù)。

3 回復(fù) 有任何疑惑可以回復(fù)我~
#1

慕瓜2376596

這個(gè)回答是正確的。你看聲明指針的語句 Shape* p = new Circle(); 這里 p指針雖然是用Shape父類聲明的,但是他卻指向了子類對(duì)象Circle; 即:p指向的地址就是:子類頭部虛函數(shù)表指針的地址。由指針p找到子類的虛函數(shù)表,從而找到子類的虛析構(gòu)函數(shù)。
2020-05-29 回復(fù) 有任何疑惑可以回復(fù)我~

虛函數(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ù)。

0 回復(fù) 有任何疑惑可以回復(fù)我~
#1

bigfire 提問者

兄弟,你沒明白我的意思。我不理解的是為什么有了虛析構(gòu)函數(shù),就能調(diào)用到子類的析構(gòu)函數(shù)。這個(gè)你了解不?
2016-07-18 回復(fù) 有任何疑惑可以回復(fù)我~

舉報(bào)

0/150
提交
取消
C++遠(yuǎn)征之多態(tài)篇
  • 參與學(xué)習(xí)       66225    人
  • 解答問題       329    個(gè)

本教程將帶領(lǐng)大家體會(huì)面向?qū)ο笕筇匦灾械亩鄳B(tài)特性

進(jìn)入課程

為什么有了虛析構(gòu)函數(shù),就能先調(diào)用子類的析構(gòu)函數(shù)

我要回答 關(guān)注問題
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)