C++虛函數(shù)的實現(xiàn)機制分析
本文針對C++的虛函數(shù)的實現(xiàn)機制進行較為深入的分析,具體如下:
1、簡單地說,虛函數(shù)是通過虛函數(shù)表實現(xiàn)的。那么,什么是虛函數(shù)表呢?
事實上,如果一個類中含有虛函數(shù),則系統(tǒng)會為這個類分配一個指針成員指向一張?zhí)摵瘮?shù)表(vtbl),表中每一項指向一個虛函數(shù)的地址,實現(xiàn)上就是一個函數(shù)指針的數(shù)組。
例如下面這個例子:
class Parent { public: virtual void foo1() { } virtual void foo1() { } void foo1(); }; class Child1 { public: void foo1() { } void foo3(); }; class Child2 { public: void foo1() {} void foo2() {} void foo3(); };
下面列出了各個類的虛函數(shù)表(vtbl)的內(nèi)容。
Parent類的vtbl:Parent::foo1( )的地址、Parent::foo1( )。
Child1類的vtbl:Child1::foo1( )的地址、Parent::foo1( )。
Child2類的vtbl:Child1::foo1( )的地址、Child2::foo1( )。
2、可以看出,虛函數(shù)表既有繼承性,又有多態(tài)性。每個派生類的vtbl繼承了它各個基類的vtbl,如果基類vtbl中包含某一項,則派生類的vtbl中也將包含同樣的一項,但是兩項的值可能不同。如果派生類覆蓋了該項對應(yīng)的虛函數(shù),則派生類vtbl的該指針先指向重載后的虛函數(shù),沒有重載的話,則沿用基類的值。
3、在類對象的內(nèi)存布局中,首先是該類的vtbl指針,然后才是對象數(shù)據(jù)。在通過對象指針調(diào)用一個虛函數(shù)時,編譯器生成的代碼將先獲取對象類的vtbl指針,然后調(diào)用vtbl中對應(yīng)的項。對于通過對象指針調(diào)用的情況,在編譯期間無法確定指針指向的是基類對象還是派生類對象,或者是哪個派生類的對象。但是在運行期間執(zhí)行到調(diào)用語句時,這一點已經(jīng)確定,編譯后的調(diào)用代碼能夠根據(jù)具體對象獲取正確的vtbl,調(diào)用正確地虛函數(shù),從而實現(xiàn)多態(tài)性。
4、分析一下這里的思想所在:
問題的實質(zhì)是這樣,對于發(fā)出虛函數(shù)調(diào)用的這個對象指針,在編譯期間缺乏更多的信息,而在運行期間具備足夠的信息,但那時已不再進行綁定了,怎么在二者之間做一個過渡呢?
把綁定所需的信息用一種通用的數(shù)據(jù)結(jié)構(gòu)記錄下來,該數(shù)據(jù)結(jié)構(gòu)可以同對象指針相聯(lián)系,在編譯時只需要使用這個數(shù)據(jù)結(jié)構(gòu)進行抽象的綁定,而在運行期間將會得到真正的綁定。這個數(shù)據(jù)結(jié)構(gòu)就是vtbl??梢钥吹?,實現(xiàn)用戶所需的抽象和多態(tài)需要進行后綁定,而編譯器又是通過抽象和多態(tài)實現(xiàn)后綁定的。
欄 目:C語言
下一篇:C語言實現(xiàn)的統(tǒng)計php代碼行數(shù)功能源碼(支持文件夾、多目錄)
本文標(biāo)題:C++虛函數(shù)的實現(xiàn)機制分析
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3538.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對數(shù)怎么表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10delphi制作wav文件的方法
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10C#中split用法實例總結(jié)
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05DEDE織夢data目錄下的sessions文件夾有什