雷火电竞-中国电竞赛事及体育赛事平台

歡迎來到入門教程網!

C語言

當前位置:主頁 > 軟件編程 > C語言 >

C++虛函數的實現機制分析

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C語言|點擊:

本文針對C++的虛函數的實現機制進行較為深入的分析,具體如下:

1、簡單地說,虛函數是通過虛函數表實現的。那么,什么是虛函數表呢?
事實上,如果一個類中含有虛函數,則系統(tǒng)會為這個類分配一個指針成員指向一張?zhí)摵瘮当恚╲tbl),表中每一項指向一個虛函數的地址,實現上就是一個函數指針的數組。

例如下面這個例子:

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();
};

下面列出了各個類的虛函數表(vtbl)的內容。
Parent類的vtbl:Parent::foo1( )的地址、Parent::foo1( )。
Child1類的vtbl:Child1::foo1( )的地址、Parent::foo1( )。
Child2類的vtbl:Child1::foo1( )的地址、Child2::foo1( )。

2、可以看出,虛函數表既有繼承性,又有多態(tài)性。每個派生類的vtbl繼承了它各個基類的vtbl,如果基類vtbl中包含某一項,則派生類的vtbl中也將包含同樣的一項,但是兩項的值可能不同。如果派生類覆蓋了該項對應的虛函數,則派生類vtbl的該指針先指向重載后的虛函數,沒有重載的話,則沿用基類的值。

3、在類對象的內存布局中,首先是該類的vtbl指針,然后才是對象數據。在通過對象指針調用一個虛函數時,編譯器生成的代碼將先獲取對象類的vtbl指針,然后調用vtbl中對應的項。對于通過對象指針調用的情況,在編譯期間無法確定指針指向的是基類對象還是派生類對象,或者是哪個派生類的對象。但是在運行期間執(zhí)行到調用語句時,這一點已經確定,編譯后的調用代碼能夠根據具體對象獲取正確的vtbl,調用正確地虛函數,從而實現多態(tài)性。

4、分析一下這里的思想所在:
問題的實質是這樣,對于發(fā)出虛函數調用的這個對象指針,在編譯期間缺乏更多的信息,而在運行期間具備足夠的信息,但那時已不再進行綁定了,怎么在二者之間做一個過渡呢?
把綁定所需的信息用一種通用的數據結構記錄下來,該數據結構可以同對象指針相聯系,在編譯時只需要使用這個數據結構進行抽象的綁定,而在運行期間將會得到真正的綁定。這個數據結構就是vtbl??梢钥吹剑?span style="color: #0000ff">實現用戶所需的抽象和多態(tài)需要進行后綁定,而編譯器又是通過抽象和多態(tài)實現后綁定的。

上一篇:VC++實現選擇排序算法簡單示例

欄    目:C語言

下一篇:C語言實現的統(tǒng)計php代碼行數功能源碼(支持文件夾、多目錄)

本文標題:C++虛函數的實現機制分析

本文地址:http://www.jygsgssxh.com/a1/Cyuyan/3538.html

網頁制作CMS教程網絡編程軟件編程腳本語言數據庫服務器

如果侵犯了您的權利,請與我們聯系,我們將在24小時內進行處理、任何非本站因素導致的法律后果,本站均不負任何責任。

聯系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網 版權所有