C 多型中的VPTR

2022-01-28 18:28:39 字數 666 閱讀 1412

以下文字摘錄自為了完成這件事,編譯器對每個包含虛函式的類建立乙個表 (稱為vtable)。在vtable中,編譯器旋轉特定類的虛函式位址。在每個帶有虛函式的類中,編譯器「秘密」地置一指標,稱為vpointer (縮寫為vptr),指向這個物件的vtable。通過基類指標(或者引用)做虛函式呼叫時,也就是做多型呼叫時,編譯器靜態地插入取得這個vptr,並在vtable表中查詢函式位址的**,這樣就能呼叫正確的函式使動態繫結發生。

為了看到vptr,特編寫如下函式:

class no_virtual

int i() const

};class one_virtual

int i() const

};class two_virtuals

virtual int i() const

};void main()

{cout<<"int:"<

不帶虛函式,物件的長度恰好就是所期望的:單個int的長度。而帶有單個虛函式的one_virtual,物件的長度是no_virtual的長度加上乙個void指標的長度。它反映出,如果有乙個或多個虛函式,編譯器將在這個結構中插入乙個指標(vptr)。在one_virtual和two_virtuals之間沒有區別。這是因為vptr指向乙個存放位址的表,只需要乙個指標,因為所有虛函式位址都包含在這個表中。

2023年8月

C 多型中的VPTR

以下文字摘錄自 為了完成這件事,編譯器對每個包含虛函式的類建立乙個表 稱為vtable 在vtable中,編譯器旋轉特定類的虛函式位址。在每個帶有虛函式的類中,編譯器 秘密 地置一指標,稱為vpointer 縮寫為vptr 指向這個物件的vtable。通過基類指標 或者引用 做虛函式呼叫時,也就是做...

c 中的多型和vptr指標

1.多型原理 include include includeusing namespace std 01 多型原理 要有繼承 虛函式重寫 父類指標指向子類物件 class parent virtual void print 動手腳 寫virtual關鍵字,c 編譯器會做特殊處理 virtual vo...

c 多型性 vptr和vtable

多型性 polymorphism 是物件導向程式設計的基本特徵之一。而在 c 中,多型性通過虛函式 virtual function 來實現。我們來看一段簡單的 include using namespace std class base virtual void fun2 virtual void...