真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++中的Vitrual-創(chuàng)新互聯(lián)

Virtual虛函數(shù) 多態(tài)
  • 使用基類的指針分別調(diào)用重載函數(shù)時(shí),調(diào)用的都是基類的函數(shù)。
  • 使用基類的指針分別調(diào)用虛函數(shù)時(shí),調(diào)用的是本類的函數(shù)。
  • 基類指針強(qiáng)制類型轉(zhuǎn)換后,虛函數(shù)調(diào)用原來的函數(shù),普通函數(shù)調(diào)用本類的函數(shù)

結(jié)論:使用類指針調(diào)用成員函數(shù)時(shí),普通函數(shù)由指針類型決定,虛函數(shù)由指針指向的實(shí)際類型決定

10年積累的成都做網(wǎng)站、網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先做網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有渦陽免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。虛函數(shù)實(shí)現(xiàn)(內(nèi)存布局)

每個(gè)類在創(chuàng)建的時(shí)候構(gòu)造一張?zhí)摵瘮?shù)表,該表是編譯器在編譯時(shí)設(shè)置的靜態(tài)數(shù)組,每個(gè)表項(xiàng)存放虛函數(shù)的入口地址(即函數(shù)指針),發(fā)生虛函數(shù)調(diào)用時(shí),通過函數(shù)指針?biāo)赶虻暮瘮?shù)來調(diào)用相應(yīng)虛函數(shù)。
vptr長8個(gè)字節(jié),用*(unsigned long *)obj取出后,因?yàn)樘摫碇忻總€(gè)元素(虛函數(shù)指針)在64位編譯器下是8個(gè)字節(jié),通過*((unsigned long *)vptr_addr+offset)即可獲得每個(gè)函數(shù)的表項(xiàng)地址。
在這里插入圖片描述

在這里插入圖片描述
可以看到子類對父類虛函數(shù)進(jìn)行重載時(shí),基類指針指向子類實(shí)例的內(nèi)存的虛函數(shù)表中,原父類虛函數(shù)已被子類虛函數(shù)覆蓋,實(shí)際調(diào)用時(shí),調(diào)用的是子類的虛函數(shù)。(注意:父類基函數(shù)在子函數(shù)前面)

如存在多重繼承,則子類中存在多個(gè)虛函數(shù)表,子類自己的虛成員函數(shù)添加到第一個(gè)聲名的虛函數(shù)表中
實(shí)現(xiàn)過程小結(jié):通過對象內(nèi)存中的vptr找到虛函數(shù)表vtbl,接著通過vtbl找到虛函數(shù)實(shí)現(xiàn)區(qū)域并調(diào)用

構(gòu)造函數(shù)無法定義虛函數(shù)

因?yàn)闃?gòu)造函數(shù)完成前,對象內(nèi)存尚未初始化,vptr沒有值,無法通過vptr找到虛函數(shù)實(shí)現(xiàn)代碼區(qū)。

盡管構(gòu)造函數(shù)不可以為虛函數(shù),但是有些場景下我們確實(shí)需要 “Virtual Copy Constructor”。 “虛復(fù)制構(gòu)造函數(shù)”的說法并不嚴(yán)謹(jǐn),其只是一個(gè)實(shí)現(xiàn)了對象復(fù)制的功能的類內(nèi)函數(shù)。 舉一個(gè)應(yīng)用場景,比如剪切板功能。 復(fù)制內(nèi)容作為基類,但派生類可能包含文字、圖片、視頻等等。 我們只有在程序運(yùn)行的時(shí)候才知道我們需要復(fù)制的具體是什么類型的數(shù)據(jù)。(例:在基類函數(shù)中聲明virual Clone)

析構(gòu)函數(shù)最好定義為虛函數(shù)

用基類類型指針綁定派生類實(shí)例,析構(gòu)的時(shí)候,如果基類析構(gòu)函數(shù)不是虛函數(shù),則只會(huì)析構(gòu)基類,不會(huì)析構(gòu)派生類對象,從而造成內(nèi)存泄漏。為什么會(huì)出現(xiàn)這種現(xiàn)象呢,析構(gòu)的時(shí)候如果沒有虛函數(shù)的動(dòng)態(tài)綁定功能,就只根據(jù)指針的類型來進(jìn)行的,而不是根據(jù)指針綁定的對象來進(jìn)行,所以只是調(diào)用了基類的析構(gòu)函數(shù);如果基類的析構(gòu)函數(shù)是虛函數(shù),則析構(gòu)的時(shí)候就要根據(jù)指針綁定的對象來調(diào)用對應(yīng)的析構(gòu)函數(shù)了。

通過基類定義虛函數(shù)重載,使派生類對象刪除時(shí)調(diào)用子類的虛析構(gòu)函數(shù),并子類析構(gòu)函數(shù)執(zhí)行完后自動(dòng)執(zhí)行父類析構(gòu)函數(shù)

虛函數(shù)成為私有函數(shù)

int main()必須聲明為Base類的友元,否則編譯失敗。 編譯器報(bào)錯(cuò): ptr無法訪問私有函數(shù)。 當(dāng)然,如果把基類聲明為public, 繼承類為private,該問題就不存在了。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧


分享題目:C++中的Vitrual-創(chuàng)新互聯(lián)
鏈接分享:http://weahome.cn/article/ecsej.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部