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

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

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

2020-05-23 14:02:57
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C/C++雜記 虛函數的實現的基本原理(圖文),需要的朋友可以參考下
 

1. 概述

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

其中:

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

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

2. 虛函數表構造過程

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

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

3. 虛函數調用過程

以下面的程序為例:
C,C++,虛函數

編譯器只知道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),例:
C,C++,虛函數

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

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

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

5. 菱形繼承

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



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久久久久免费精品| 亚洲第一福利网| 精品久久久久久中文字幕| 国内精品一区二区三区四区| 日韩在线免费视频观看| 不卡av在线网站| 久久久久久久久电影| 国产区亚洲区欧美区| 日韩福利伦理影院免费| 精品久久久久久中文字幕一区奶水| 人人做人人澡人人爽欧美| 国产亚洲a∨片在线观看| 欧美成aaa人片在线观看蜜臀| 国产日本欧美在线观看| 中文字幕日韩在线观看| 久久久久久久久中文字幕| 精品综合久久久久久97| 98午夜经典影视| 国产成人aa精品一区在线播放| 中文精品99久久国产香蕉| 欧美性生交大片免费| 亚洲精品国偷自产在线99热| 午夜精品在线观看| 国产精品久久久久久久久免费看| 日韩美女激情视频| 日韩一区二区三区xxxx| 欧美有码在线视频| 久久久久久久999| 亚洲免费小视频| 日韩精品福利网站| 国语自产精品视频在线看| 欧美午夜宅男影院在线观看| 亚洲一区二区三区四区视频| 欧美—级a级欧美特级ar全黄| 91精品国产免费久久久久久| 人体精品一二三区| 亚洲成人av在线播放| 欧美一乱一性一交一视频| 欧美区在线播放| 日韩久久午夜影院| 色99之美女主播在线视频| 久久免费成人精品视频| 亚洲另类激情图| 懂色av一区二区三区| 欧美影院在线播放| 日韩欧美国产中文字幕| 欧美中文字幕视频在线观看| 午夜精品久久久99热福利| 狠狠爱在线视频一区| 国产日韩在线亚洲字幕中文| www国产亚洲精品久久网站| 欧洲美女7788成人免费视频| 欧美精品videos| 国产成人精品视频在线| 亚洲美女精品成人在线视频| 91超碰中文字幕久久精品| 精品一区二区三区四区| 成人免费淫片视频软件| 欧美日韩亚洲一区二| 国内偷自视频区视频综合| 欧美大片欧美激情性色a∨久久| 国产精品久久久久久久久久东京| 精品视频在线播放免| 久久香蕉精品香蕉| 国产69精品久久久久99| 精品美女国产在线| 色综合久综合久久综合久鬼88| 国产亚洲精品高潮| 亚洲精品日韩丝袜精品| 欧美午夜激情视频| 亚洲自拍中文字幕| 欧美肥臀大乳一区二区免费视频| 国产亚洲人成a一在线v站| 少妇精69xxtheporn| 色婷婷综合成人| 蜜臀久久99精品久久久久久宅男| 日韩中文字幕国产| 国产成人综合精品| 欧美大片网站在线观看| 欧美精品18videosex性欧美| 日韩美女av在线| 欧美中文字幕第一页| 国产不卡精品视男人的天堂| 亚洲女同精品视频| 91成人免费观看网站| 欧美一区二区三区艳史| 国产亚洲精品日韩| www.欧美三级电影.com| 国产91色在线免费| 国产精品久久久久久久久久久新郎| 欧美大全免费观看电视剧大泉洋| 91在线观看欧美日韩| 在线视频日韩精品| 日韩av影视在线| 亚洲成人av片在线观看| 亚洲国产婷婷香蕉久久久久久| 亚洲欧美日韩国产精品| xxxxx成人.com| 亚洲少妇中文在线| 亚洲xxx大片| 一区二区三区视频免费| 最近2019中文字幕第三页视频| 欧美乱大交xxxxx| www.99久久热国产日韩欧美.com| 国自产精品手机在线观看视频| 欧美中文字幕在线播放| 国产伦精品一区二区三区精品视频| 色综合色综合久久综合频道88| 91精品久久久久久久久久久久久| 国产精品国产三级国产aⅴ浪潮| 国产狼人综合免费视频| 日韩亚洲一区二区| 中文字幕欧美日韩va免费视频| 尤物九九久久国产精品的分类| 欧美中文在线免费| 精品视频在线观看日韩| 成人午夜在线视频一区| 日韩精品在线观| 亚洲欧美另类自拍| 亚洲综合av影视| 欧美性生交xxxxxdddd| 亚洲第一天堂无码专区| 久久久久久网址| 在线亚洲午夜片av大片| 国产精品自产拍在线观看| 久久久精品久久久| 大荫蒂欧美视频另类xxxx| 久久久久久久电影一区| 日本国产高清不卡| 精品视频在线导航| 这里只有精品视频| 成人妇女免费播放久久久| 国产精品video| 久久99精品久久久久久青青91| 国产精品日韩欧美| 久久影院资源站| 92福利视频午夜1000合集在线观看| 激情久久av一区av二区av三区| 精品视频一区在线视频| 九九热视频这里只有精品| 日韩精品在线播放| 国产97色在线| 91chinesevideo永久地址| 日韩最新av在线| 日韩av在线网| 精品美女国产在线| 国产成人自拍视频在线观看| 亚州精品天堂中文字幕| 国产精品中文久久久久久久| 综合国产在线视频| 久久久久成人网| 亚洲一区二区三区毛片| 少妇激情综合网| 国产福利精品视频| 亚洲色图35p| 欧美激情成人在线视频| 亚洲欧美国产一区二区三区| 国产日韩换脸av一区在线观看| 久久人人爽人人爽爽久久| 国产精品日韩在线观看| 久热爱精品视频线路一| 亚洲人成电影网站色www| 国产在线拍揄自揄视频不卡99| 久久精品国产亚洲7777|