c 詳解虛表

2021-07-25 10:01:47 字數 1229 閱讀 4521

(注:以下的執行環境是vs2008)

每個有虛函式的類或者虛繼承的子類,編譯器都會為它生成乙個虛表,表中的每乙個元素都指向乙個虛函式的位址(虛表是從屬於類的)

1)編譯器會為包含虛函式的類加上乙個成員變數,是乙個指向該虛函式表的指標,虛表指標是從屬於物件的,也就是說,如果乙個類含有虛表,那麼類的每個物件都含有虛表指標 2)

虛表的內容是依據類中的虛函式宣告次序—填入函式指標。

1)基類(虛表):按照虛函式在基類中出現的先後次序進行一次逐個填寫虛表位址。

2)派生類(虛表):

a、先要知道基類虛表的格式

b、派生類對基類中那些虛函式進行重寫,如果重寫了,會將虛表中相同偏移位置的函式的位址進行重寫

c、再將最後四個位元組寫為0

注意:1、     不同物件的虛表位址相同

2、     基類型別的指標指向派生類物件,要呼叫派生類重寫的函式時,無法呼叫

(分別從繼承方式,有無重寫和是否是虛擬繼承來進行分析)

1)說明:程式的結果:

a:基類的列印自己的,派生類的也列印自己的 

b:基類大小:如果有成員的話,就是成員加頭四個位元組(指向虛表的指標)派生類大小;如果有成員的話,就是成員加基類加指向虛表的指標

2)舉例**:

#includeusing namespace std;

class base

virtual void fun0()

virtual void fun0()

virtual void fun0()

virtual void fun0()

virtual void fun0()

virtual void fun0()

virtual void fun0()

virtual void fun0()

virtual void fun0()

virtual void fun0()

virtual void fun0()

virtual void fun0()

virtual void fun0()

{ cout<

3)程式執行結果

最後要說明的:還有一些情況類似於上面的,我就不一一說明了,我寫的都是比較經典的情況,希望能對大家有所幫助!

C 中虛函式 虛指標和虛表詳解

關於虛函式的背景知識 用virtual關鍵字申明的函式叫做虛函式,虛函式肯定是類的成員函式。存在虛函式的類都有乙個一維的虛函式表叫做虛表。每乙個類的物件都有乙個指向虛表開始的虛指標。虛表是和類對應的,虛表指標是和物件對應的。多型性是乙個介面多種實現,是物件導向的核心。分為編譯多型性和執行多型性。執行...

虛函式,虛指標和虛表詳解

關於虛函式的背景知識 1.用virtual關鍵字申明的函式叫做虛函式,虛函式肯定是類的成員函式。2.存在虛函式的類都有乙個一維的虛函式表叫做虛表。每乙個類的物件都有乙個指向虛表開始的虛指標。虛表是和類對應的,虛表指標是和物件對應的。3.多型性是乙個介面多種實現,是物件導向的核心。分為編譯多型性和執行...

C 虛函式 純虛函式 多型與虛表機制詳解

在類的定義中,前面有virtual關鍵字的成員函式就是虛函式。注 派生類中的成員函式 與 基類中虛函式同名且同引數的函式,不加virtual也自動成為虛函式。沒有函式體的虛函式稱作純虛函式,包含純虛函式的類叫抽象類。注 class a int main 多型的實現是通過虛函式。多型的作用是增強程式的...