C 虛函式表 typedef指向函式的指標

2022-09-12 18:18:21 字數 1087 閱讀 1900

一、typedef函式指標

2.虛函式表——注意:父類與子類的虛函式表是不同的,不是同乙個表。

1、虛函式就是通過一張虛函式表實現的。簡稱為v-table。在這個表中,主要是乙個類的虛函式的位址表,這張表解決了繼承覆蓋的問題。

c++標準並沒有規定虛函式的實現方法,使用虛函式表的方法是編譯器廠商制定的。

2、舉個例子:

1 (fun)*((int*)*(int*)(&b)+0);  //

base::f()

2 (fun)*((int*)*(int*)(&b)+1);  //

base::g()

3 (fun)*((int*)*(int*)(&b)+2);  //

base::h()

3、**虛函式表:

4、一般的繼承(無虛函式覆蓋)的虛函式表

在這個類的繼承關係中,子類沒有過載任何父類的函式,那麼在派生類的例項中,其虛函式表如下圖所示:

對於派生類的物件:derive d;其虛函式表如下圖

5、有虛函式覆蓋的虛函式表

覆蓋父類的虛函式是很顯然的事情,不然虛函式就變得毫無存在地意義。如果在類中有虛函式過載了父類的虛函式,我們假設右下邊的乙個繼承關係:

1 base *b = new

derive();

2 b->f();34

//由於b所指的記憶體中的虛函式表的f()的位置已經被derive::f()函式的位址所取代,於是在實際的呼叫過程中是derive::f()被呼叫的,這就實現了多型。

父類與子類的虛函式表是不一樣的

6、多重繼承(無虛函式覆蓋)

每個父類都有自己的虛函式表

子類的成員函式被放到了第乙個父類的表中。(第乙個父類即按照宣告的順序判斷的)

這麼做是為了解決不同的父型別的指標指向同乙個子類例項,而能夠呼叫到實際的函式

7、多重繼承(有虛函式覆蓋)

C 虛函式表

考慮最簡單的有虛函式的繼承關係 class f class s public f 此時,我們可以定義乙個父類的指標,實際指向乙個子類的物件。呼叫func函式的結果是子類的函式。虛函式在這裡是動態繫結的。f f new s f func 輸出s func 我們知道子類即使不定義虛函式也會繼承該虛函式表...

C 虛函式表

一般來說,對於開發者我們只需要知道虛函式的使用方法,以及虛函式表的存在即可。但面試時往往會遇到更細節的問題,比如讓你實現乙個虛函式機制,雖然不太實用,總歸了解些底層知識也是件好事。但如果有人苦苦相逼一定要拿這個刷人,你就去罵他吧,你才是寫編譯器的,你們全家都是寫編譯器的。唉,我有些失態了.1.虛函式...

C 虛函式表

c 中的虛函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的 來實現可變的演算法。比如 模板技術,rtti技術,虛函式技術,...