這篇文章將為大家詳細講解有關關于C++虛函數工作原理的介紹,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
成都創新互聯公司致力于互聯網品牌建設與網絡營銷,包括成都網站建設、成都做網站、SEO優化、網絡推廣、整站優化營銷策劃推廣、電子商務、移動互聯網營銷等。成都創新互聯公司為不同類型的客戶提供良好的互聯網應用定制及解決方案,成都創新互聯公司核心團隊10年專注互聯網開發,積累了豐富的網站經驗,為廣大企業客戶提供一站式企業網站建設服務,在網站建設行業內樹立了良好口碑。靜態綁定與動態綁定
討論靜態綁定與動態綁定,首先需要理解的是綁定,何為綁定?函數調用與函數本身的關聯,以及成員訪問與變量內存地址間的關系,稱為綁定。 理解了綁定后再理解靜態與動態。
C++中動態綁定
在C++中動態綁定是通過虛函數實現的,是多態實現的具體形式。而虛函數是通過虛函數表實現的。這個表中記錄了虛函數的地址,解決繼承、覆蓋的問題,保證動態綁定時能夠根據對象的實際類型調用正確的函數。這個虛函數表在什么地方呢?C++標準規格說明書中說到,編譯器必須要保證虛函數表的指針存在于對象實例中最前面的位置(這是為了保證正確取到虛函數的偏移量)。也就是說,我們可以通過對象實例的地址得到這張虛函數表,然后可以遍歷其中的函數指針,并調用相應的函數。
虛函數的工作原理
要想弄明白動態綁定,就必須弄懂虛函數的工作原理。C++中虛函數的實現一般是通過虛函數表實現的(C++規范中沒有規定具體用哪種方法,但大部分的編譯器廠商都選擇此方法)。類的虛函數表是一塊連續的內存,每個內存單元中記錄一個JMP指令的地址。編譯器會為每個有虛函數的類創建一個虛函數表,該虛函數表將被該類的所有對象共享。 類的每個虛成員占據虛函數表中的一行。如果類中有N個虛函數,那么其虛函數表將有N*4字節的大小。
虛函數(virtual)是通過虛函數表來實現的,在這個表中,主要是一個類的虛函數的地址表,這張表解決了繼承、覆蓋的問題,保證其真實反映實際的函數。這樣,在有虛函數的類的實例中分配了指向這個表的指針的內存(位于對象實例的最前面),所以,當用父類的指針來操作一個子類的時候,這張虛函數表就顯得尤為重要,指明了實際所應調用的函數。它是如何指明的呢?后面會講到。
JMP指令是匯編語言中的無條件跳轉指令,無條件跳轉指令可轉到內存中任何程序段。轉移地址可在指令中給出,也可以在寄存器中給出,或在儲存器中指出。
首先我們定義一個帶有虛函數的基類
class Base { public: virtual void fun1(){ cout<<"base fun1!\n"; } virtual void fun2(){ cout<<"base fun2!\n"; } virtual void fun3(){ cout<<"base fun3!\n"; } int a; };
網站名稱:關于C++虛函數工作原理的介紹-創新互聯
標題鏈接:http://vcdvsql.cn/article32/iespc.html
成都網站建設公司_創新互聯,為您提供網站維護、定制網站、網站建設、做網站、標簽優化、搜索引擎優化
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯