探索多型的實現 虛表

2021-08-10 08:50:41 字數 1936 閱讀 5927

上次說到了多型,可是多型在編譯器裡到底是如何實現的呢?

下面我們就來探索一下它深層的實現機制

我們可以從監視視窗來看一下

這張表解決了繼承、虛函式(重寫)的問題;

有虛函式就有虛表(從父類繼承就自動生成了),虛函式表就像乙個路標,指明了實際應該呼叫哪個虛函式

還是用我最喜歡的圖示來說明,下圖

我們還是來看一下監視

但是這裡看監視視窗是有一些問題的

並沒有看到虛表裡有func3、func4,這是為什麼呢?難道他們沒有在虛表裡?

在是肯定在,只是在監視不能顯示出來,所以這裡我們可以自己寫個函式將虛表列印出來

typedef

void(*func) ();

void printvtable(int* vtable)//列印虛表

可以看出func1在子類中重寫了,func2繼承來沒有變動,func3、func4就在後面依次存放著

class base1

virtual

void func2()

private:

int a;

};class base2

virtual

void func2()

private:

int b;

};class derive :public base1, public base2 //多繼承,寫的順序,就是繼承先後的順序

探索虛函式與多型

測試環境 win10 64位 vs2013 一些概念 虛函式 類的成員函式前面加上virtual關鍵字,則此成員函式即為虛函式。重寫 在子類定義了乙個與父類完全相同的虛函式,則稱子類的虛函式重寫了父類的虛函式。多型 多型就是多種形態,c 的多型分為靜態多型和動態多型。靜態多型就是過載,因為在編譯期間...

c 實現多型的方法 虛表

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

C 虛表(探索多型的原理)和菱形繼承

菱形繼承 多繼承 兩個子類繼承同乙個父類,而又有子類 同時繼承這兩個子類。菱形繼承關係模型如下圖 菱形繼承的 如下 dd的物件中有兩個aa成員 include includeusing namespace std class aa class bb public aa class cc public...