亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C/C++雜記 虛函數的實現的基本原理(圖文)

2020-01-26 14:33:37
字體:
來源:轉載
供稿:網友

1. 概述

簡單地說,每一個含有虛函數(無論是其本身的,還是繼承而來的)的類都至少有一個與之對應的虛函數表,其中存放著該類所有的虛函數對應的函數指針。例:

其中:

B的虛函數表中存放著B::foo和B::bar兩個函數指針。
D的虛函數表中存放的既有繼承自B的虛函數B::foo,又有重寫(override)了基類虛函數B::bar的D::bar,還有新增的虛函數D::quz。

提示:為了描述方便,本文在探討對象內存布局時,將忽略內存對齊對布局的影響。

2. 虛函數表構造過程

編譯器的角度來說,B的虛函數表很好構造,D的虛函數表構造過程相對復雜。下面給出了構造D的虛函數表的一種方式(僅供參考):

提示:該過程是由編譯器完成的,因此也可以說:虛函數替換過程發生在編譯時。

3. 虛函數調用過程

以下面的程序為例:

編譯器只知道pb是B*類型的指針,并不知道它指向的具體對象類型 :pb可能指向的是B的對象,也可能指向的是D的對象。

但對于“pb->bar()”,編譯時能夠確定的是:此處operator->的另一個參數是B::bar(因為pb是B*類型的,編譯器認為bar是B::bar),而B::bar和D::bar在各自虛函數表中的偏移位置是相等的。

無論pb指向哪種類型的對象,只要能夠確定被調函數在虛函數中的偏移值,待運行時,能夠確定具體類型,并能找到相應vptr了,就能找出真正應該調用的函數。

提示:本人曾在“C/C++雜記:深入理解數據成員指針、函數成員指針”一文中提到:虛函數指針中的ptr部分為虛函數表中的偏移值(以字節為單位)加1。

B::bar是一個虛函數指針, 它的ptr部分內容為9,它在B的虛函數表中的偏移值為8(8+1=9)。

當程序執行到“pb->bar()”時,已經能夠判斷pb指向的具體類型了:

復制代碼 代碼如下:

如果pb指向B的對象,可以獲取到B對象的vptr,加上偏移值8((char*)vptr + 8),可以找到B::bar。
如果pb指向D的對象,可以獲取到D對象的vptr,加上偏移值8((char*)vptr + 8) ,可以找到D::bar。
如果pb指向其它類型對象...同理...

4. 多重繼承

當一個類繼承多個類,且多個基類都有虛函數時,子類對象中將包含多個虛函數表的指針(即多個vptr),例:

其中:D自身的虛函數與B基類共用了同一個虛函數表,因此也稱B為D的主基類(primary base class)。

虛函數替換過程與前面描述類似,只是多了一個虛函數表,多了一次拷貝和替換的過程。

虛函數的調用過程,與前面描述基本類似,區別在于基類指針指向的位置可能不是派生類對象的起始位置,以如下面的程序為例:

5. 菱形繼承

本文不討論菱形繼承的情形,個人覺得:菱形繼承的復雜度遠大于它的使用價值,這也是C++讓人又愛又恨的原因之一。

如果想要深入研究,可以參考:Itanium C++ ABI。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美精品中文字幕| 成人高清视频观看www| 亚洲淫片在线视频| 欧美极品少妇xxxxⅹ喷水| 中文字幕欧美日韩va免费视频| 亚洲成人网在线观看| 亚洲精品国产电影| 亚洲成人999| 亚洲free性xxxx护士hd| 亚洲天堂男人的天堂| 成人福利视频在线观看| 欧美大片网站在线观看| 亚洲精品色婷婷福利天堂| 国产久一一精品| 日韩人在线观看| 91国内免费在线视频| 国产视频精品自拍| 国产视频综合在线| 91精品国产综合久久久久久久久| 中文字幕欧美日韩| 欧美电影《睫毛膏》| 亚洲国产精品久久久久久| 日韩欧美一区二区三区久久| 欧美日韩激情视频8区| 欧美日韩国产专区| 亚洲精品白浆高清久久久久久| 中文字幕av一区二区三区谷原希美| 欧美另类69精品久久久久9999| 久久久久国产精品www| 亚洲最大的免费| 国产精品久久一| 欧美成人免费播放| zzijzzij亚洲日本成熟少妇| 在线观看日韩av| 不卡在线观看电视剧完整版| 一级做a爰片久久毛片美女图片| 亚洲最大福利视频网站| 国产xxx69麻豆国语对白| 色偷偷av亚洲男人的天堂| 亚洲男人天堂手机在线| 亚洲一区二区中文| 日韩精品视频免费专区在线播放| 亚洲性线免费观看视频成熟| 成人午夜一级二级三级| 日韩在线观看网址| 国产精品久久久久一区二区| 超在线视频97| 精品电影在线观看| 欧美乱大交做爰xxxⅹ性3| 欧美性生交xxxxxdddd| 国产欧美精品日韩| 清纯唯美亚洲综合| 久久噜噜噜精品国产亚洲综合| 久久夜色精品国产欧美乱| 欧美激情精品久久久久久| 日韩精品视频免费专区在线播放| 久久国产天堂福利天堂| 久久不射电影网| 91精品视频播放| 成人国产精品免费视频| 成人有码视频在线播放| 日韩精品在线观| 日本久久中文字幕| 欧美成人国产va精品日本一级| 久久精品久久精品亚洲人| 亚洲成年人在线| 亚洲毛片在线看| 中文字幕亚洲二区| 亚洲一区二区久久久久久| 91香蕉嫩草影院入口| 热久久免费国产视频| 国产精品美女在线| 亚洲精品日产aⅴ| 欧美老女人www| 91久久久久久久久久| 久久久天堂国产精品女人| 成人性生交大片免费看小说| 国产精品偷伦免费视频观看的| 国产福利成人在线| 欧美日本啪啪无遮挡网站| 欧美激情第一页xxx| 96精品视频在线| 国产v综合ⅴ日韩v欧美大片| 国外色69视频在线观看| 亚洲免费视频观看| 亚洲欧美一区二区精品久久久| 欧美性生活大片免费观看网址| 国产精品久久久久久久久久久久久久| 亚洲天堂开心观看| 国产视频精品在线| 亚洲精品国产综合区久久久久久久| 国产精品视频大全| 国产精品99免视看9| 国产成人97精品免费看片| 国产成人拍精品视频午夜网站| 57pao国产成人免费| 久久精品99国产精品酒店日本| 久久久久久久一区二区三区| 中文字幕日韩在线播放| 国产欧美在线播放| 日韩中文第一页| 激情成人中文字幕| 成人xvideos免费视频| 最近免费中文字幕视频2019| 国产亚洲视频中文字幕视频| 久久久久久网站| 欧美高清电影在线看| 亚洲免费成人av电影| 欧洲成人免费视频| 国产在线精品一区免费香蕉| 日韩美女av在线免费观看| 国产午夜精品理论片a级探花| 成人xvideos免费视频| 日韩免费电影在线观看| 欧美性猛交视频| 日韩高清电影好看的电视剧电影| 国内精品久久久久影院优| 欧美国产日韩一区二区| 亚洲精品成人久久| 最近2019好看的中文字幕免费| 欧美视频专区一二在线观看| 91人人爽人人爽人人精88v| 日韩成人av网| 亚洲国产精品国自产拍av秋霞| 欧美一级淫片丝袜脚交| 精品一区二区亚洲| 欧美第一黄色网| 57pao成人国产永久免费| www.日韩av.com| 久久视频中文字幕| 国产成人福利夜色影视| 18一19gay欧美视频网站| 97精品久久久中文字幕免费| 国产精品丝袜久久久久久不卡| 日韩中文字幕在线播放| 成人写真福利网| 国产精品福利在线观看| 亚洲精品免费av| 欧美成年人视频网站| 精品久久久久久久久久久久| 国产这里只有精品| 日韩精品视频在线| 美女精品久久久| 成人福利视频在线观看| 欧美激情视频免费观看| 亚洲国产婷婷香蕉久久久久久| 久久久91精品| 精品亚洲国产成av人片传媒| 成人在线激情视频| www.久久色.com| 亚洲国产精品va在线看黑人| 久久久成人的性感天堂| 亚洲自拍偷拍第一页| 成人一区二区电影| 日韩一区二区欧美| 91精品国产91久久久久| 欧美精品久久久久久久免费观看| 少妇av一区二区三区| 中文字幕亚洲一区二区三区五十路| 亚洲第一视频网站| 91精品视频免费| 国产日韩欧美黄色| 91精品视频大全| 欧美精品在线第一页|