虛函式(虛函式表vtable 的實現

2021-06-16 07:03:09 字數 611 閱讀 9742

乙個動態的鏈結究竟怎樣實現的呢?

首先,如果乙個基類中有虛函式,則編譯器自動生成乙個指向虛函式位址的表。有

幾個虛函式,對應的虛函式表(vftable)的長就是幾。

然後,在基類中生成乙個指向虛函式表的指標。

對應的每個虛函式由編譯器將其對映為虛函式表指標(__vfptr)加上乙個數字(這個數

字就是真正的虛函式的位址對應於虛函式表的下標),取出該元素的值,便得到真正的虛函

數的位址。比如類a有virtual get(); virtualset(); 兩個虛函式。則他們的位址分別被編譯器

設為:*__vfptr[0],*__vfptr[1]。

當子類繼承父類的時候,連同它的虛函式表指標一同繼承。虛函式表指標(__vfptr)指向

只自己的表,表內的值則分別指向自己的虛函式。

如果子類從多個類中繼承,那麼它父類的__vfptr也都會被繼承,比如:

class a : public b,public c;  //b和 c中都有虛函式,則他會得到b::__vfptr 和 c::__vfptr。

由於__vfptr是動態生成的,因此無法在原始碼中顯示呼叫。

(注:__vfptr 和 vftable的名字來自vs2010)

C 虛函式表vtable理解

如果乙個記憶體段儲存的是乙個指標,則指向該記憶體段的指標至少是乙個二級指標。及若 p為位址,則p至少是乙個二級指標。而 p為非位址,則p為一級指標。若p為int型指標,則 p解引用的位址長度範圍為4個位元組 而如果p為乙個物件b的指標,則 p解引用的位址長度範圍為sizeof b 如果b為乙個物件,...

虛函式表指標,虛函式表

對c 了解的人都應該知道虛函式 virtual function 是通過一張虛函式表 virtual table 來實現的。簡稱為v table。在這個表中,主是要乙個類的虛函式的位址表,這張表解決了繼承 覆蓋的問題,保證其容真實反應實際的函式。這樣,在有虛函式的類的例項中這個表被分配在了 這個例項...

虛指標,虛函式,虛函式表,純虛函式

虛指標 虛繼承 在使用多重繼承時,如存在 class a 有m a變數 class a1 virtual public a,m a1 class a2 virtual public a m a2 class b public a1,public a2 m b 時 存在以下記憶體儲存順序 虛指標 指向...