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

2021-07-14 03:27:54 字數 1936 閱讀 2593

原文:

關於一般單繼承c++物件的記憶體布局,我們假設有如下所示的乙個繼承關係:

請注意,在這個繼承關係中,父類,子類,孫子類都有自己的乙個成員變數。而了類覆蓋了父類的f()方法,孫子類覆蓋了子類的g_child()及其超類的f()。

我們的源程式如下所示:

class

parent

virtual

voidf()

virtual

voidg()

virtual

voidh()

};class

child

:public

parent

virtual

voidf()

virtual

void

g_child

()

virtual

void

h_child

() };

class

grandchild

:public

child

virtual

voidf()

virtual

void

g_child

()

virtual

void

h_grandchild

() };

我們使用以下程式作為測試程式:(下面程式中,我使用了乙個int** pvtab 來作為遍歷物件記憶體布局的指標,這樣,我就可以方便地像使用陣列一樣來遍歷所有的成員包括其虛函式表了,在後面的程式中,我也是用這樣的方法的,請不必感到奇怪,)

typedef

void

(*fun

)(void

);

grandchildgc;

int**pvtab =(

int**)&gc;

cout

<<

"[0] grandchild::_vptr->"

<<

endl

;

for(

inti=0

;(fun)

pvtab[0

][i]!=null;i

++) cout

<<

"[1] parent.iparent = "

<<

(int

)pvtab[1

]<<

endl

; cout

<<

"[2] child.ichild = "

<<

(int

)pvtab[2

]<<

endl

; cout

<<

"[3] grandchild.igrandchild = "

<<

(int

)pvtab[3

]<<

endl

;

其執行結果如下所示:(在vc++ 2003和g++ 3.4.4下)

[0] grandchild::_vptr->

[0] grandchild::f()

[1] parent::g()

[2] parent::h()

[3] grandchild::g_child()

[4] child::h1()

[5] grandchild::h_grandchild()

[1] parent.iparent = 10

[2] child.ichild = 100

[3] grandchild.igrandchild = 1000

可見以下幾個方面:

1)虛函式表在最前面的位置。

2)成員變數根據其繼承和宣告順序依次放在後面。

3)在單一的繼承中,被overwrite的虛函式在虛函式表中得到了更新。

C 物件記憶體布局之繼承

感謝在部落格寫作過程中韓朋程和羅國佳的寶貴意見!繼承,是c 語言程式設計中重要的組成部分。c 物件模型,簡單的理解可以說就是c 中乙個物件的記憶體布局。下面就總結一下類繼承對c 物件的記憶體布局產生的影響。首先,請記住如下規則 以下規則針對的都是vc編譯器 1 對於一般的類繼承。如果基類和派生類都具...

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

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

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

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