色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深度解析C++中的虛函數(shù)

jf_78858299 ? 來(lái)源:阿Q正磚 ? 作者:阿Q正磚 ? 2023-02-15 11:14 ? 次閱讀

虛函數(shù)作為C++的重要特性,讓人又愛(ài)又怕,愛(ài)它功能強(qiáng)大,但又怕駕馭不好,讓它反咬一口,今天我們用CPU的角度,撕掉語(yǔ)法的偽裝,重新認(rèn)識(shí)一下虛函數(shù)。

虛函數(shù)是C++實(shí)現(xiàn)面向?qū)ο笤O(shè)計(jì)及多態(tài)特性的重要手段。沒(méi)有虛函數(shù),C++和C的區(qū)別就不大,都需要借助大量的“函數(shù)指針”,進(jìn)行面向?qū)ο蟮某绦蛟O(shè)計(jì)(特別是功能擴(kuò)展方面)。

有了虛函數(shù)的存在,函數(shù)指針的使用率大大降低,代碼可讀性,代碼數(shù)量都能得到大幅度的改善。

最厲害的是,C++的虛函數(shù)實(shí)現(xiàn)機(jī)制,幾乎同時(shí)在空間、效率上獲得了最優(yōu)解。

學(xué)習(xí)C++,虛函數(shù)是一條必經(jīng)之路!

先來(lái)看兩段簡(jiǎn)單代碼

圖片

讓我們先比較一下普通函數(shù)體與虛函數(shù)體有什么區(qū)別,顯然,兩個(gè)函數(shù)是完全一致的,虛函數(shù)跟普通函數(shù)一樣,都會(huì)夾帶一個(gè)隱藏參數(shù)this指針。所以,如你所見(jiàn),虛函數(shù)在實(shí)現(xiàn)方面,跟普通函數(shù)沒(méi)有任何區(qū)別。

讓我們?cè)倏纯凑{(diào)用它們的時(shí)候,會(huì)有什么不同

圖片

通過(guò)對(duì)比,大部分地方也是相同的,箭頭指的那兩條指令都是在輸入:隱藏參數(shù) this指針。唯一的區(qū)別是,調(diào)用普通函數(shù)時(shí),call指令的目標(biāo)地址在編譯階段就確定了,也就是所謂的“靜態(tài)綁定”;但調(diào)用虛函數(shù)時(shí),call指令只能根據(jù)rdx寄存器的值來(lái)確定函數(shù)的位置,也就是所謂的“動(dòng)態(tài)綁定”。

再深入理解下這幾條指令

圖片

原來(lái)當(dāng)類(lèi)A有虛函數(shù)的時(shí)候,類(lèi)A就會(huì)偷偷生成一個(gè)隱藏成員變量,方便起見(jiàn),我們給這個(gè)隱藏變量起一個(gè)名字:V(指針類(lèi)型),V存放著虛函數(shù)表的地址,根據(jù)偏移,就可以得到要執(zhí)行的vtest_1 的地址,將其存在寄存器rdx里面,隨后一條:call rdx 指令,一個(gè)虛函數(shù)的調(diào)用就完成了。如果說(shuō),類(lèi)的成員函數(shù)會(huì)夾帶隱藏參數(shù) this指針,還能接受的話,那么,我說(shuō)類(lèi)還會(huì)夾帶隱藏變量V,你能接受嗎?如果真的存在隱藏變量V,在哪里給V初始化呢?答案是在A的構(gòu)造函數(shù)中,把V初始化成類(lèi)A的虛函數(shù)表地址,如下:

圖片

盡管我沒(méi)有寫(xiě)構(gòu)造函數(shù),編譯器還是會(huì)給我 生成一個(gè)默認(rèn)的構(gòu)造函數(shù) ,它一定、必須要幫我完成隱藏變量V的初始化。

當(dāng)然,A有派生類(lèi)B的話

圖片

那么隱藏變量V會(huì)在B的構(gòu)造函數(shù)中被初始化為B的虛函數(shù)表地址,從而保證A、B的虛函數(shù)相互獨(dú)立,井水不犯河水,但考慮到派生類(lèi)B的構(gòu)造函數(shù),還會(huì)調(diào)用基類(lèi)A的構(gòu)造函數(shù)。因此,變量V一會(huì)兒會(huì)被初始化成類(lèi)A的虛函數(shù)表,一會(huì)又會(huì)被初始化成類(lèi)B的虛函數(shù)表,為了避免暈頭,往往會(huì)禁止在構(gòu)造函數(shù)里面調(diào)用虛函數(shù)。

小結(jié)一下:

1、虛函數(shù)在函數(shù)體的實(shí)現(xiàn)方面跟普通函數(shù)沒(méi)有任何區(qū)別。

2、虛函數(shù)的調(diào)用需要借助類(lèi)對(duì)象的隱藏變量 V(vptr)來(lái)完成,隱藏變量V(vptr)會(huì)在構(gòu)造函數(shù)中被初始化成虛函數(shù)表的內(nèi)存地址。

3、調(diào)用任何虛函數(shù)的套路都是一樣的,唯一的區(qū)別是要根據(jù)它們?cè)谔摵瘮?shù)表的位置設(shè)置正確的偏移量。

大家可以看看調(diào)用vtest_1()和調(diào)用vtest_2()的唯一區(qū)別是什么?

圖片

不得不佩服虛函數(shù)的實(shí)現(xiàn)方法,幾乎同時(shí)在效率的空間上得到了最優(yōu)解,因?yàn)樘摵瘮?shù)的出現(xiàn),函數(shù)指針的使用率大大降低,如果你還是被函數(shù)指針困擾的時(shí)候,或許可以考慮一下虛函數(shù)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10854

    瀏覽量

    211583
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2108

    瀏覽量

    73621
  • 虛函數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    8

    瀏覽量

    1696
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C++函數(shù)virtual詳解

    C++ 函數(shù)用于解決動(dòng)態(tài)多態(tài)問(wèn)題,函數(shù)的作用是允許在派生類(lèi)
    發(fā)表于 09-07 11:27 ?2878次閱讀

    C++函數(shù)操作指南(含代碼示例)

    本期博客,我們來(lái)介紹C++函數(shù),并給出一些實(shí)際操作的建議。
    發(fā)表于 02-12 10:12 ?673次閱讀

    C++標(biāo)準(zhǔn)編程:函數(shù)與內(nèi)聯(lián)

      曾經(jīng)在討論C++的時(shí)候,經(jīng)常會(huì)問(wèn)到:“函數(shù)能被聲明為內(nèi)聯(lián)嗎?”現(xiàn)在,我們幾乎聽(tīng)不到這個(gè)問(wèn)題了。現(xiàn)在聽(tīng)到的是:“你不應(yīng)該使print成為內(nèi)聯(lián)的。聲明一個(gè)
    發(fā)表于 05-03 11:53

    關(guān)于C++函數(shù)重載機(jī)制

    ,而且同類(lèi)型的同名函數(shù)能夠更好地發(fā)揮多種功能.宏觀體現(xiàn)就是使用一個(gè)函數(shù)名字可以完成各種同類(lèi)型但是不同細(xì)節(jié)的函數(shù)調(diào)用(例如,參數(shù)的類(lèi)型不同,或者僅僅是多了一個(gè)控制量參數(shù)......).所以C++
    發(fā)表于 10-01 17:18

    什么是C++函數(shù)? 應(yīng)該怎么定義? 用途是什么?

    什么是C++函數(shù)? 應(yīng)該怎么定義? 主要用途是什么?
    發(fā)表于 11-08 06:58

    C++如何處理內(nèi)聯(lián)函數(shù)

    當(dāng)一個(gè)函數(shù)是內(nèi)聯(lián)和函數(shù)時(shí),會(huì)發(fā)生代碼替換或使用表調(diào)用嗎? 為了弄 清楚內(nèi)聯(lián)和函數(shù),讓我們將
    發(fā)表于 11-29 11:59 ?28次下載

    C++程序設(shè)計(jì)教程之多態(tài)性與函數(shù)的詳細(xì)資料說(shuō)明

    本文檔詳細(xì)介紹的是C++程序設(shè)計(jì)教程之多態(tài)性與函數(shù)的詳細(xì)資料說(shuō)明主要資料包括了:1 多態(tài)性的概念,2 一個(gè)典型的例子,3 函數(shù),4 純
    發(fā)表于 03-14 16:39 ?5次下載
    <b class='flag-5'>C++</b>程序設(shè)計(jì)教程之多態(tài)性與<b class='flag-5'>虛</b><b class='flag-5'>函數(shù)</b>的詳細(xì)資料說(shuō)明

    如何深度解析C++拷貝構(gòu)造函數(shù)詳細(xì)資料說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何深度解析C++拷貝構(gòu)造函數(shù)詳細(xì)資料說(shuō)明。
    發(fā)表于 07-05 17:41 ?0次下載
    如何<b class='flag-5'>深度</b><b class='flag-5'>解析</b><b class='flag-5'>C++</b>拷貝構(gòu)造<b class='flag-5'>函數(shù)</b>詳細(xì)資料說(shuō)明

    如何在中斷C函數(shù)調(diào)用C++

    之前,我們?cè)趩纹瑱C(jī)程序開(kāi)發(fā)時(shí)都會(huì)面對(duì)中斷函數(shù)。眾所周知的,這個(gè)中斷函數(shù)肯定是要用C函數(shù)來(lái)定義的。我在用C++進(jìn)行程序開(kāi)發(fā)的時(shí)候就發(fā)現(xiàn)了一個(gè)需
    發(fā)表于 05-09 18:17 ?0次下載
    如何在中斷<b class='flag-5'>C</b><b class='flag-5'>函數(shù)</b><b class='flag-5'>中</b>調(diào)用<b class='flag-5'>C++</b>

    圖文詳解:C++表的剖析

    圖文詳解:C++表的剖析
    的頭像 發(fā)表于 06-29 14:23 ?2534次閱讀
    圖文詳解:<b class='flag-5'>C++</b><b class='flag-5'>虛</b>表的剖析

    EE-128:C++的DSP:從C++調(diào)用匯編類(lèi)成員函數(shù)

    EE-128:C++的DSP:從C++調(diào)用匯編類(lèi)成員函數(shù)
    發(fā)表于 04-16 17:04 ?2次下載
    EE-128:<b class='flag-5'>C++</b><b class='flag-5'>中</b>的DSP:從<b class='flag-5'>C++</b>調(diào)用匯編類(lèi)成員<b class='flag-5'>函數(shù)</b>

    C++語(yǔ)法的inline內(nèi)聯(lián)函數(shù)詳解

    上節(jié)我們分析了C++基礎(chǔ)語(yǔ)法的const,static以及 this 指針,那么這節(jié)內(nèi)容我們來(lái)看一下 inline 內(nèi)聯(lián)函數(shù)吧! inline 內(nèi)聯(lián)函數(shù) 特征 相當(dāng)于把內(nèi)聯(lián)函數(shù)里面的內(nèi)
    的頭像 發(fā)表于 09-09 09:33 ?3360次閱讀

    C++如何用函數(shù)實(shí)現(xiàn)多態(tài)

    01 — C++函數(shù)探索 C++是一門(mén)面向?qū)ο笳Z(yǔ)言,在C++里運(yùn)行時(shí)多態(tài)是由
    的頭像 發(fā)表于 09-29 14:18 ?1693次閱讀

    一文詳解函數(shù)及其相關(guān)知識(shí)點(diǎn)

    本期是C++基礎(chǔ)語(yǔ)法分享的第七節(jié),今天給大家來(lái)分享一下: (1)析構(gòu)函數(shù); (2)純函數(shù); (3)
    的頭像 發(fā)表于 10-13 10:14 ?7925次閱讀

    函數(shù)C++開(kāi)發(fā)者如何有效利用

    函數(shù)是基類(lèi)聲明的成員函數(shù),且使用者期望在派生類(lèi)中將其重新定義。那么,在 C++ ,什么是
    的頭像 發(fā)表于 02-11 09:39 ?931次閱讀
    主站蜘蛛池模板: 精品四虎国产在免费观看| 亚洲精品青青草原avav久久qv| adc我们的永久网址| 久久中文字幕人妻AV熟女| 亚洲另类欧美综合在线| 国产一及毛片| 亚洲国产三级在线观看| 国产人妻精品无码AV在线五十路| 十八禁久久成人一区二区| 成人免费视频在线观看| 清冷受被CAO的合不拢| 99视频在线观看视频| 嫩草影院久久精品| 97色伦久久视频在观看| 美女胸被男子强捏视频| 91亚洲精品| 免费看片A级毛片免费看| 97午夜伦伦电影理论片| 免费人成在线观看网站视频| 最新国自产拍天天更新| 久久亚洲AV成人无码动态图| 一线高清视频在线播放| 久久囯产精品777蜜桃传媒| 一二三四电影完整版免费观看| 精品无码三级在线观看视频| 亚洲三级黄色| 久久精品久久久久| 中文字幕人成乱码中国| 麻豆XXXX乱女少妇精品| 999www成人免费视频| 捏揉舔水插按摩师| AV福利无码亚洲网站麻豆| 青青草干免费线观看| 出差无套内射小秘书| 肉肉的各种姿势高H细文 | 欧美疯狂做受xxxxx喷水| av淘宝 在线观看| 热99re久久精品国产首页| 丰满少妇67194视频| 我在厨房摸岳的乳HD在线观看| 国产亚洲精品在浅麻豆|