虛表 虛指標

2022-08-14 08:21:15 字數 1068 閱讀 5459

虛函式在c++中的實現機制就是用虛表和虛指標,但是具體是怎樣的呢?從more effecive c++其中一篇文章裡面可以知道:是每個類用了乙個虛表,每個類的物件用了乙個虛指標。具體的用法如下:

[cpp]view plain

copy

class

a  ;  

class

b : 

public

a  ;  

//a,b的實現省略

因為a有virtual void f(),和g(),所以編譯器為a類準備了乙個虛表vtablea,內容如下:

a::f 的位址

a::g 的位址

b因為繼承了a,所以編譯器也為b準備了乙個虛表vtableb,內容如下:

a::f 的位址

b::g 的位址

注意:因為b::g是重寫了的,所以b的虛表的g放的是b::g的入口位址,但是f是從上面的a繼承下來的,所以f的位址是a::f的入口位址。

然後某處有語句 b bb;的時候,編譯器分配空間時,除了a的int a,b的成員int b;以外,還分配了乙個虛指標vptr,指向b的虛表vtableb,bb的布局如下:

vptr : 指向b的虛表vtableb

int a: 繼承a的成員

int b: b成員

當如下語句的時候:

a *pa = &bb;

pa的結構就是a的布局(就是說用pa只能訪問的到bb物件的前兩項,訪問不到第三項int b)

重生之大文豪 www.dwhao.com

那麼pa->g()中,編譯器知道的是,g是乙個宣告為virtual的成員函式,而且其入口位址放在**(無論是vtalbea表還是 vtalbeb表)的第2項,那麼編譯器編譯這條語句的時候就如是轉換:call *(pa->vptr)[1](c語言的陣列索引從0開始哈~)。

這一項放的是b::g()的入口位址,則就實現了多型。(注意bb的vptr指向的是b的虛表vtableb)

另外要注意的是,如上的實現並不是唯一的,c++標準只要求用這種機制實現多型,至於虛指標vptr到底放在乙個物件布局的**,標準沒有要求,每個編譯器自己決定。

虛函式,虛表,虛表指標

分享一篇文章,詳細解釋了為什麼通過基類指標指向基類物件或派生類物件,就可以呼叫相應類的虛函式。自 一 概述 為了實現c 的多型,c 使用了一種動態繫結的技術。這個技術的核心是虛函式表 下文簡稱虛表 本文介紹虛函式表是如何實現動態繫結的。二 類的虛表 每個包含了虛函式的類都包含乙個虛表。我們知道,當乙...

虛繼承 虛表 虛指標

c 實現多型的方法 其實很多人都知道,虛函式在c 中的實現機制就是用虛表和虛指標,但是具體是怎樣的呢?從more effecive c 其中一篇文章裡面可以知道 是每個類用了乙個虛表,每個類的物件用了乙個虛指標。具體的用法如下 class a class b public a a,b的實現省略 因為...

虛表指標和虛表

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