內容參考於《21天學通c++》(第八版)1. 示例不去糾結c++的原理和細節,從c的角度去學習c++,再通過c++專案去加深理解
class
base
virtual
void
func2()
// .. so on and so forth
virtual
void
funcn()
};class
derived
:public base
// no implementation for func2()
virtual
void
funcn()
};
base 類,它宣告了 n 個虛函式,derived 類繼承了 base 類,並覆蓋了除base::func2( )外的其他所有虛函式。
編譯器見到這種繼承層次結構後,知道 base 定義了一些虛函式,並在 derived 中覆蓋了它們。在這種情況下, 編譯器將為實現了虛函式的基類和覆蓋了虛函式的派生類分別建立乙個虛函式表( virtual function table, vft)。換句話說, base 和 derived 類都將有自己的虛函式表。例項化這些類的物件時,將建立乙個隱藏的指標(我們稱之為 vft*),它指向相應的 vft。可將 vft 視為乙個包含函式指標的靜態陣列,其中每個指標都指向相應的虛函式。
每個虛函式表都由函式指標組成,其中每個指標都指向相應虛函式的實現。在類 derived 的虛函式表中,除乙個函式指標外,其他所有函式指標都指向 derived 本地的虛函式實現。 derived 沒有覆蓋base::func2( ),因此相應的函式指標指向 base 類的 func2( )實現。
這意味著遇到下述**時,編譯器將查詢 derived 類的 vft,確保呼叫 base::func2( )的實現:
cderived objderived;
objderived.
func2()
;
呼叫被覆蓋的方法時,也將如此:
void
dosomething
(base& objbase)
intmain()
;
在這種情況下,雖然將 objderived 傳遞給了 objbase,進而被解讀為乙個 base 例項,但該例項的vft 指標仍指向 derived 類的虛函式表,因此通過該 vtf 執行的是 derived::func1( )。虛函式表就是這樣幫助實現 c++多型的。
2. 證明vtf的存在
#include
using
namespace std;
class
******class};
class
base};
intmain()
32位編譯器執行結果
sizeof(******class)
= 8sizeof(base)
= 12
32位編譯器執行結果
sizeof(******class)
= 8sizeof(base)
= 16
C 多型 虛函式 指標 虛函式表
本文總結了和幾位老師的部落格 一 什麼是多型 關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的 來實現可變的演算法。比如 模板技術,rtti技術,虛函式技術...
c 虛函式和多型 虛函式表
參考 1 c primer plus 第六版 2 中國大學慕課 程式設計與演算法 三 在類的定義中,前面有virtual關鍵字的成員函式就是虛函式 class a 類外函式定義 void a function 說明 1 virtual關鍵字只需要在類定義裡的函式宣告時加上,函式定義時不用加 2 建構...
c 虛函式表與多型
本篇文章是對b站上乙個課程的筆記 對於乙個空類,其sizeof值是1 對空類加入兩個普通成員函式,其sizeof仍然是1 只有成員變數會占用記憶體空間,普通成員函式並不會占用空間 繼續加入乙個虛函式,sizeof值變成了4!這是因為,如果類中存在虛函式,則編譯器就會在類中插入乙個看不見的成員變數,也...