虛函式原理解析

2021-07-04 21:35:32 字數 1140 閱讀 4686

虛函式原理

虛函式的一般實現模型:每個類有乙個虛函式表,內含該類中有作用的虛函式位址。每個 物件有乙個vptr(虛函式表指標)指向虛函式表

如下person類

class person

;

在person的物件jack中,有兩個東西,乙個是資料成員name_,乙個是_vptr_person(指向虛函式表的指標),其中_vptr_person儲存著以下東西:

如果man整合class person,man如下所示:

class man:person

;

在man物件star中有三個東西,乙個是從person中繼承而來的name_,乙個是自己的haswhat,都是資料成員,另乙個為_vptr_man(虛函式表指標):

其中,如果man類裡面重寫了person類裡面的虛函式,則虛函式表被重寫函式的對應位置替換為派生類裡面的函式位址,如man的虛函式表中,將person::~person() person::getname();的位址替換為man::~man() 和man::getname(),沒有重寫的則依舊為基類虛函式的位址

而且,此時,man類可作為基類,繼續被繼承,滿足如上關係。

若派生類繼承多個具有虛函式的類,因為需要向上型別轉換,所以派生類裡面就有多個虛函式指標。則其結構體大小會增加乙個虛函式指標的大小,如下**所示:

class a

};class b

;class c:public b

;class d:public b,public a

;int main ()

{ cout<

具體輸出依賴於機器,但是滿足 sizeof(a) = sizeof(b) = sizeof(c) = sizeof(d) / 2;

注意:虛函式指標在類中的位置,取決於編譯器具體實現,不過一般虛函式表指標的位置在類的首部,即類最開始的位置。

虛函式原理解析

虛函式原理 如下person類 class person 在person的物件jack中,有兩個東西,乙個是資料成員name 乙個是 vptr person 指向虛函式表的指標 其中 vptr person儲存著以下東西 如果man整合class person,man如下所示 class man p...

虛函式的實現原理 c 虛函式表解析

這裡有一篇部落格介紹的很詳細 c 虛函式表解析 typedef void fun void 這是將fun定義為乙個指向 void void 函式型別的函式指標 b 得到物件的位址 開頭 int int b 對指標解引用,得到指向虛函式表 指標陣列 的指標,函式表中存放著指向函式的指標。int b 2...

理解虛函式

虛函式聯絡到多型,多型聯絡到繼承。所以本文中都是在繼承層次上做文章。沒了繼承,什麼都沒得談。下面是對c 的虛函式這玩意兒的理解。什麼是虛函式 如果不知道虛函式為何物,但有急切的想知道,那你就應該從這裡開始 簡單地說,那些被virtual關鍵字修飾的成員函式,就是虛函式。虛函式的作用,用專業術語來解釋...