C 虛函式表

2022-08-01 12:48:09 字數 764 閱讀 2348

對其分析如下:

每個含有虛函式的類在記憶體中多一根指標(vptr),見圖中a,b,c物件中第乙個位置,儲存的是虛函式表(vtbl)所在的位置。

虛函式表(vtbl)儲存著所有虛函式的位置,由於其動態繫結特性,在覆寫(override)後在子類中儲存的虛函式位置與父類中不相同。

分析上述**, b繼承a,所以a中的資料部分也被b繼承下來,同時b新增上了自己的資料部分m_data3,加之vptr,組成了b左側的記憶體布局。

a中的虛函式vfunc1(),vfunc2()可以被覆寫和動態繫結。

所以在b中,vfunc1()被覆寫,其vtbl中對應項指向了新的函式的位置(亮藍色)。vfunc2()未被覆寫,仍然指向原先位置(深藍色)。

c與b同理,vfunc1()被覆寫,其vtbl中對應項指向了新的函式的位置(橘黃色)。vfunc2()未被覆寫,仍然指向原先位置(深藍色)。

非虛函式靜態繫結,儲存在單獨的記憶體空間(code memory section,灰色函式部分),呼叫時把物件的this指標,傳給乙個invisible引數,以便確定誰在呼叫函式。

呼叫虛函式的語句的c語言形式如圖中下部分所示,其中n表示對應的函式在第幾個位置(編譯器在建立虛函式表的時候已知),從而實現動態繫結。

C 虛函式表

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

C 虛函式表

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

C 虛函式表

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