上次說到了多型,可是多型在編譯器裡到底是如何實現的呢?
下面我們就來探索一下它深層的實現機制
我們可以從監視視窗來看一下
這張表解決了繼承、虛函式(重寫)的問題;
有虛函式就有虛表(從父類繼承就自動生成了),虛函式表就像乙個路標,指明了實際應該呼叫哪個虛函式
還是用我最喜歡的圖示來說明,下圖
我們還是來看一下監視
但是這裡看監視視窗是有一些問題的
並沒有看到虛表裡有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...