C 中的物件模型

2021-07-30 21:14:35 字數 1255 閱讀 6087

所謂多型,即「多種形態「。

c++中虛函式的主要作用就是實現多型,每乙個具有虛函式的類都叫做多型類。這個虛函式或者是從基類繼承來的,或者是自己新增的。c++編譯器為每乙個多型類至少創

建乙個虛函式表(vtable),他其實就是乙個函式指標陣列,其中存放著這個類所有的虛函式的位址及該類的型別資訊,其中也包括那些繼承但未改寫的虛函式。簡單地說父類

的指標/引用呼叫重寫的虛函式,當父類指標/引用指向父類物件時呼叫的是父類的函式,指向子類物件時呼叫的是子類的函式。

【以下測試均在windows7 32位vs2008環境下的測試】

1、探索虛函式表

虛函式表是通過一塊連續記憶體來儲存虛函式的位址。這張表解決了繼承、虛函式(重寫)的問題。在虛函式的物件例項中都存在一張虛函式表、虛函式表就像一張地圖、指

明了實際應該呼叫的虛函式。

#include

using namespace std;

class base

virtual void func2()

private:

int a;

};void test1()

int main()

【虛函式表】

2、探索單繼承物件模型

vs2008監視視窗中的虛表

可以看到派生類derive::func1重寫基類base::func1,覆蓋了相應虛表位置上的函式。(可以看到這裡沒有看到派生類derive中的func3和func4,這個函式就放在func2的後面,這

裡沒有顯示是vs的問題(bug))。

【單繼承物件模型】

3、探索多重繼承的記憶體分布

【多重繼承物件模型】

4、多型

多型即多種形態,c++的多型分為靜態多型和動態多型。

(1)靜態多型就是過載,因為是在編譯期決議確定,所以稱為靜態多型。

(2)動態多型就是通過繼承重寫基類的虛函式實現的多型,因為是在執行時決議確定、所以稱為動態多型。

C 中物件的記憶體模型

1 在不涉及虛函式的情況下,乙個物件所占用的空間,和乙個有相同欄位的結構體所占用的空間相同,不會有關於方法的內容。2 物件的方法同樣是放在 段的,在程式的入口處有乙個方法向量表,實際上就是一系列 jmp函式入口的語句,每乙個就表示乙個函式。具體內容,我們可以檢視一下下面的反彙編 tc show tc...

C 虛擬繼承中的物件模型

最近,從師兄那裡聽到一道據說是某國內知名 it公司的面試題,有關 c 虛擬繼承的。include using namespace std class t class a virtual public t class b virtual public t class c public a,public...

C 中的類與物件模型

一,c c 記憶體模型 1.記憶體模型分類 堆區 由程式設計師分配和釋放,如果程式設計師沒有釋放則在程式結束時由os釋放,由於忘記釋放通常會出現記憶體洩露問題。全域性 靜態 區 用來儲存全域性變數和靜態變數,程式結束時由os釋放。常量區 存放字面量,不允許修改,如字串 hello,unreal 程式...