關於虛表和虛表指標

2021-07-30 12:24:59 字數 1883 閱讀 1865

1:動態多型

動態繫結:在程式執行期間(非編譯期間)判斷所引用物件的實際型別,根據其實際型別呼叫相應的方法。

2:動態多型具體實現、

class a

virtual

void funtest2()

int _a;

};class b1 : public a

virtual

void funtest3()

int _b1;

};void funtest(a &s)

int main()

在funtest函式裡面用基類的引用作為引數,真正傳過去的是派生類的物件,而且在派生類裡面是對funtest1函式進行了重寫的,所以在執行期間會根據所引用的具體型別呼叫相應的函式。

3:虛表的簡單檢視

通過求取b1類的大小可以在記憶體中檢視b1的儲存方式,圖上所表示的是虛表指標指向的虛表和列印出來的虛表的實際對應.通過對b1物件記憶體的分析可以知道除了b1所含的兩個整型意外,最上面的四個位元組就是虛表指標,指向的虛表通過列印的方式顯示出來如圖中所示,由於b1對a類是公有繼承而且在b1類中對基類的funtest1函式進行了重寫,所以派生類b1的虛表就應該是圖中所顯示的內容。

如圖所示,就是c類物件在記憶體空間的具體儲存,紅色線所指函式或者數字即為c類物件中的指標所指內容,要麼是偏移量大小,要麼是虛表指標,特別之處在於兩個 『-4』,表示的是從該位置向上偏移四個位元組才是c通過這個繼承體系繼承的b1,b2 類在c中儲存的起始位置。12和24就是偏移量大小,若c b1 b2需要訪問基類成員所需要偏移的位元組數。

虛表指標和虛表

父類中有虛函式,父類繼承子類後 1 有各自的虛表指標和虛表 2 對於子類中未被重寫的虛函式,在父子類各自虛表中儲存的函式位址都是父類中的虛函式位址 3 對於子類中被重寫的虛函式,在父子類各自的虛表中儲存的函式位址是不同的 exp1 無覆蓋時 include using namespace std c...

關於C 虛表和虛指標

以下為個人的一些理解,如有不對,敬請大家斧正。class base virtual void fun class derive base virtual void act 虛表是c 用於實現多型的一種方式,每個擁有虛函式的類編譯器都會為之分配一張虛表,指向虛表的指標即為虛指標,例如以上兩個類base...

虛指標和虛表

所以當用sizeof來獲取含有虛函式的類的大小的時候,會發現結果 比 裡面還有的資料 大4個位元組。這四個位元組就是 虛 指標。32位系統 子類裡面有父類的成員變數。當然,父類有虛函式,自然 子類 就有虛函式。虛表裡放的都是虛函式的指標,指向虛函式的位址。子類即使沒有重寫 父類的 虛函式,子類的虛表...