c 虛函式表與多型

2021-10-18 05:00:57 字數 1581 閱讀 1621

本篇文章是對b站上乙個課程的筆記

對於乙個空類,其sizeof值是1

對空類加入兩個普通成員函式,其sizeof仍然是1(只有成員變數會占用記憶體空間,普通成員函式並不會占用空間)

繼續加入乙個虛函式,sizeof值變成了4!!

這是因為,如果類中存在虛函式,則編譯器就會在類中插入乙個看不見的成員變數,也就是虛函式表指標 *vptr,該成員變數佔4個位元組。

當乙個類中有至少乙個虛函式時,在編譯期間,編譯器會為該類生成乙個虛函式表,這個虛函式表會從始至終伴隨這個類,經過編譯鏈結儲存到可執行檔案中。

對有虛函式的類,編譯器會在編譯期間,在該類的建構函式中默默新增乙個為虛函式表指標賦值的語句。在建立物件時,會呼叫建構函式,此時就會使得虛函式指標指向虛函式表。

在類a中有兩個普通的成員函式,兩個普通虛函式,乙個虛析構函式,和兩個成員變數。

當生成類a物件時,在記憶體中的布局如下: 占用記憶體空間的只有虛函式表指標以及兩個成員變數,虛函式表指標指向虛函式表,由於該類有三個虛函式,所以虛函式表中的三個位址分別指向三個虛函式,兩個普通成員函式屬於類的成員,但是不在類的物件中占有記憶體。

多型必須存在虛函式,沒有虛函式絕不可能存在多型。

實現多型必須有以下三個條件

1.程式中有父類和子類的繼承關係,父類指標必須含有虛函式,子類中也必須重寫父類中的虛函式。

2.用父類的指標指向子類的物件/用父類的引用繫結子類的物件。

3.用這個父類指著呼叫子類中重寫的虛函式。

該類中有乙個父類base,乙個子類derive,子類中重寫了g函式,記憶體結構如下圖所示:

父類和子類都有乙個自己的虛函式表指標,指向自己的虛函式表。父類和子類的虛函式表中都有三個位址,對於普通的成員函式,虛函式表中的位址項相同,對於重寫的虛函式會用新的函式位址進行覆蓋。因此在用父類的指標指向子類物件時,是通過子類物件的虛函式表指標找到子類的虛函式表,從而查詢到虛函式的位址。

C 多型 虛函式 指標 虛函式表

本文總結了和幾位老師的部落格 一 什麼是多型 關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的 來實現可變的演算法。比如 模板技術,rtti技術,虛函式技術...

c 虛函式和多型 虛函式表

參考 1 c primer plus 第六版 2 中國大學慕課 程式設計與演算法 三 在類的定義中,前面有virtual關鍵字的成員函式就是虛函式 class a 類外函式定義 void a function 說明 1 virtual關鍵字只需要在類定義裡的函式宣告時加上,函式定義時不用加 2 建構...

七 多型 虛函式表(C )

內容參考於 21天學通c 第八版 不去糾結c 的原理和細節,從c的角度去學習c 再通過c 專案去加深理解 1.示例class base virtual void func2 so on and so forth virtual void funcn class derived public base...