乙個動態的鏈結究竟怎樣實現的呢?
首先,如果乙個基類中有虛函式,則編譯器自動生成乙個指向虛函式位址的表。有
幾個虛函式,對應的虛函式表(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 時 存在以下記憶體儲存順序 虛指標 指向...