在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

深度解析C++中的虛函數

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

虛函數作為C++的重要特性,讓人又愛又怕,愛它功能強大,但又怕駕馭不好,讓它反咬一口,今天我們用CPU的角度,撕掉語法的偽裝,重新認識一下虛函數。

虛函數是C++實現面向對象設計及多態特性的重要手段。沒有虛函數,C++和C的區別就不大,都需要借助大量的“函數指針”,進行面向對象的程序設計(特別是功能擴展方面)。

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

最厲害的是,C++的虛函數實現機制,幾乎同時在空間、效率上獲得了最優解。

學習C++,虛函數是一條必經之路!

先來看兩段簡單代碼

圖片

讓我們先比較一下普通函數體與虛函數體有什么區別,顯然,兩個函數是完全一致的,虛函數跟普通函數一樣,都會夾帶一個隱藏參數this指針。所以,如你所見,虛函數在實現方面,跟普通函數沒有任何區別。

讓我們再看看調用它們的時候,會有什么不同

圖片

通過對比,大部分地方也是相同的,箭頭指的那兩條指令都是在輸入:隱藏參數 this指針。唯一的區別是,調用普通函數時,call指令的目標地址在編譯階段就確定了,也就是所謂的“靜態綁定”;但調用虛函數時,call指令只能根據rdx寄存器的值來確定函數的位置,也就是所謂的“動態綁定”。

再深入理解下這幾條指令

圖片

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

圖片

盡管我沒有寫構造函數,編譯器還是會給我 生成一個默認的構造函數 ,它一定、必須要幫我完成隱藏變量V的初始化。

當然,A有派生類B的話

圖片

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

小結一下:

1、虛函數在函數體的實現方面跟普通函數沒有任何區別。

2、虛函數的調用需要借助類對象的隱藏變量 V(vptr)來完成,隱藏變量V(vptr)會在構造函數中被初始化成虛函數表的內存地址。

3、調用任何虛函數的套路都是一樣的,唯一的區別是要根據它們在虛函數表的位置設置正確的偏移量。

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

圖片

不得不佩服虛函數的實現方法,幾乎同時在效率的空間上得到了最優解,因為虛函數的出現,函數指針的使用率大大降低,如果你還是被函數指針困擾的時候,或許可以考慮一下虛函數。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    11038

    瀏覽量

    216038
  • C++
    C++
    +關注

    關注

    22

    文章

    2117

    瀏覽量

    74788
  • 虛函數
    +關注

    關注

    0

    文章

    8

    瀏覽量

    1759
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    C++函數virtual詳解

    C++ 函數用于解決動態多態問題,函數的作用是允許在派生類
    發表于 09-07 11:27 ?3075次閱讀

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

    本期博客,我們來介紹C++函數,并給出一些實際操作的建議。
    發表于 02-12 10:12 ?1012次閱讀

    C++標準編程:函數與內聯

      曾經在討論C++的時候,經常會問到:“函數能被聲明為內聯嗎?”現在,我們幾乎聽不到這個問題了。現在聽到的是:“你不應該使print成為內聯的。聲明一個
    發表于 05-03 11:53

    關于C++函數重載機制

    ,而且同類型的同名函數能夠更好地發揮多種功能.宏觀體現就是使用一個函數名字可以完成各種同類型但是不同細節的函數調用(例如,參數的類型不同,或者僅僅是多了一個控制量參數......).所以C++
    發表于 10-01 17:18

    什么是C++函數? 應該怎么定義? 用途是什么?

    什么是C++函數? 應該怎么定義? 主要用途是什么?
    發表于 11-08 06:58

    C++如何處理內聯函數

    當一個函數是內聯和函數時,會發生代碼替換或使用表調用嗎? 為了弄 清楚內聯和函數,讓我們將
    發表于 11-29 11:59 ?28次下載

    C++程序設計教程之多態性與函數的詳細資料說明

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

    如何深度解析C++拷貝構造函數詳細資料說明

    本文檔的主要內容詳細介紹的是如何深度解析C++拷貝構造函數詳細資料說明。
    發表于 07-05 17:41 ?0次下載
    如何<b class='flag-5'>深度</b><b class='flag-5'>解析</b><b class='flag-5'>C++</b>拷貝構造<b class='flag-5'>函數</b>詳細資料說明

    如何在中斷C函數調用C++

    之前,我們在單片機程序開發時都會面對中斷函數。眾所周知的,這個中斷函數肯定是要用C函數來定義的。我在用C++進行程序開發的時候就發現了一個需
    發表于 05-09 18:17 ?0次下載
    如何在中斷<b class='flag-5'>C</b><b class='flag-5'>函數</b><b class='flag-5'>中</b>調用<b class='flag-5'>C++</b>

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

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

    EE-128:C++的DSP:從C++調用匯編類成員函數

    EE-128:C++的DSP:從C++調用匯編類成員函數
    發表于 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>調用匯編類成員<b class='flag-5'>函數</b>

    C++語法的inline內聯函數詳解

    上節我們分析了C++基礎語法的const,static以及 this 指針,那么這節內容我們來看一下 inline 內聯函數吧! inline 內聯函數 特征 相當于把內聯函數里面的內
    的頭像 發表于 09-09 09:33 ?3558次閱讀

    C++如何用函數實現多態

    01 — C++函數探索 C++是一門面向對象語言,在C++里運行時多態是由
    的頭像 發表于 09-29 14:18 ?1885次閱讀

    一文詳解函數及其相關知識點

    本期是C++基礎語法分享的第七節,今天給大家來分享一下: (1)析構函數; (2)純函數; (3)
    的頭像 發表于 10-13 10:14 ?8196次閱讀

    函數C++開發者如何有效利用

    函數是基類聲明的成員函數,且使用者期望在派生類中將其重新定義。那么,在 C++ ,什么是
    的頭像 發表于 02-11 09:39 ?1129次閱讀
    主站蜘蛛池模板: 99精品久久99久久久久久 | 久久久精品2021免费观看 | 思思久久96热在精品不卡 | 黄色的视频网站在线观看 | 天天噜噜色 | 午夜视频在线观看完整高清在线 | 国产caoni111在线观看视频 | 一区二区三区视频在线观看 | 天天碰天天操 | 国产精品性 | 久久精品伊人波多野结 | 狠狠色成色综合网 | 9984四虎永久免费网站 | 小优视频在线 | 劳拉淫欲护士bd字幕 | 婷婷六月综合网 | 色伊人网| 777人体粉嫩u美图 | 日本h片在线观看 | 国产色视频网站 | 欧美久操 | 校园 春色 欧美 另类 小说 | 亚洲一区二区三区电影 | 久久99精品久久久久久久野外 | 日本视频一区二区 | 天天谢天天干 | 天天操天天干天天舔 | 激情综合五月网 | 永久黄网站色视频免费 | 日韩成人毛片高清视频免费看 | 欧美一级特黄aa大片视频 | 色片免费网站 | 成人午夜啪啪免费网站 | 全免费a级毛片免费看不卡 全日本爽视频在线 | 色六月婷婷 | 婷婷丁香色综合狠狠色 | 欧美日韩一区二区三区视视频 | 在线视频免费视频网站 | 欧美黄色免费 | 色综合色综合色综合色综合 | 免费在线h视频 |