C 物件記憶體布局之繼承

2021-06-21 07:55:01 字數 1491 閱讀 4738

感謝在部落格寫作過程中韓朋程和羅國佳的寶貴意見!!

繼承,是c++語言程式設計中重要的組成部分。c++物件模型,簡單的理解可以說就是c++中乙個物件的記憶體布局。下面就總結一下類繼承對c++物件的記憶體布局產生的影響。

首先,請記住如下規則(以下規則針對的都是vc編譯器):

1、  對於一般的類繼承。如果基類和派生類都具有虛函式,在派生類物件的記憶體布局中,所有的虛函式都存放在一張虛函式表中(多重繼承時會有多個虛函式表)。即,派生類中,從基類繼承的虛函式與自身新定義的虛函式共用一張虛函式表 。

2、  對於虛繼承。如果基類和派生類都具有虛函式,在派生類物件的記憶體布局中,基類和派生類的虛函式存在於不同的虛函式表中。即,派生類中,從基類繼承的虛函式在一張虛函式表中,派生類自身新定義的虛函式在另一張虛函式表中。為了支援虛繼承,vc編譯器在物件模型中加入了乙個虛基類指標,虛基類指標在任何情況下都不會共享。

3、派生類物件的記憶體布局中要保證基類子物件空間的完整性。

下面對這三條規則進行詳細說明。

一般來說,不帶虛函式的類繼承是沒有什麼實質性意義的。但是,為了更好的說明本文的主題。對這種情況進行簡單的描述。

假如有如下兩個類:

class base

;class derived:public base

;

定義乙個派生類物件b,b的記憶體布局如下圖所示。其中,n1和n2各佔4b:

上文舉例使用的是單一繼承,對於多重繼承,記憶體布局並沒有大的改變。還是先放基類成員再放派生類成員,基類成員的排列順序按照定義派生類時基類的排列順序來定。

完整**如下:

gcc編譯器對繼承的實現與vc編譯器不太一樣。不同之處在於,無論是否是虛繼承,派生類中,從基類繼承的虛函式與派生類自身新定義的虛函式共享虛函式表。不會像vc編譯器,虛繼承時虛基類的虛函式表並不會與派生類虛函式表合併。

C 物件的記憶體布局 多繼承

多繼承中,乙個派生類可以有多個基類.多繼承是c 頗受爭議的乙個語法特性,它就像一把雙刃劍,在提供便利及強大功能的同時,也帶來了一些容易使人產生錯誤的不便.在此主要說明一下多繼承時物件的記憶體分布 1.與單繼承相同,首先建立基類的物件,但要遵循一定的順序,這個順序是由派生類宣告時決定.2.和單繼承也一...

c 虛繼承物件的記憶體布局

好了,我們從最基礎的的討論起。當c 支援virtual base class 時,就會多了一些額外負擔,當class 中內含乙個或多個virtual base class subobject時,將分成兩個部分,乙個不變區域性和乙個共享區域性。最初的方案是為每乙個虛基類安插乙個指標指向這個虛基類,其缺...

C 物件的記憶體布局(單繼承)

原文 關於一般單繼承c 物件的記憶體布局,我們假設有如下所示的乙個繼承關係 請注意,在這個繼承關係中,父類,子類,孫子類都有自己的乙個成員變數。而了類覆蓋了父類的f 方法,孫子類覆蓋了子類的g child 及其超類的f 我們的源程式如下所示 class parent virtual voidf vi...