類的記憶體模型(二)

2021-10-10 18:15:45 字數 1734 閱讀 7214

單繼承**如下:

class base;

class derived : public base ;

對於基類,和之前簡單的物件不一樣,該物件的記憶體空間不僅儲存非靜態的成員變數,而且儲存了乙個指標,叫「虛指標(vptr)」。只要有虛函式,物件的記憶體空間就會多出乙個虛指標。但注意:無論該物件有多少個虛函式,物件的記憶體空間也最多只有乙個虛指標。虛指標指向虛表,虛表的每個元素不是函式而是函式指標。

下面是子類的物件的構造過程,即 執行derived d

子類繼承父類,所以按照父類構造方式構造(只是按照父類方式,但是還是屬於子類物件的記憶體空間);

按照父類方式構造完,新增子類獨有的成員變數;

新增虛函式(當虛函式與父類虛函式重複時,覆蓋虛表中對應的項,即替換函式指標);

當子類需要新增虛函式時,需要在虛表中新增一項,儲存新的虛函式的函式指標。

然後,再看下單繼承類derived的記憶體模型:

多繼承:乙個子類有多個父類。

**如下:

class basea;

class baseb;

class derived : public basea, public baseb ;

轉化成uml圖之後,如下:

原因:因為basea、baseb都是繼承於base,所以basea、baseb各有乙份m_b,而derived又是繼承於basea、baseb,自然derived的布局要按照basea、baseb的方式來分布,所以,derived有兩份m_b。

方法1:可以通過指定訪問物件來解決

derived dd;

dd.basea::m_b = 1;

dd.baseb::m_b = 2;

方法2:要解決空間浪費的問題,就只能使用虛繼承來解決。

類 物件的記憶體模型

原問題如下 include using namespace std class base void fun2 int main 的結果為4。這個我覺得是因為那個虛函式表裡的乙個指標佔了4個位元組 但是如果我去掉virtual 的結果為1 類中的普通成員函式佔物件的空間嗎?資料成員所佔空間的計算是否也...

c 類物件的記憶體模型

c 類物件記憶體結構 首先介紹一下c 中有繼承關係的類物件記憶體的布局 在c 中,如果類中有虛函式,那麼它就會有乙個虛函式表的指標 vfptr,在類物件最開始的記憶體資料中。之後是類中的成員變數的記憶體資料。對於子類,最開始的記憶體資料記錄著父類物件的拷貝 包括父類虛函式表指標和成員變數 之後是子類...

c 類物件的記憶體模型

c 類物件記憶體結構 首先介紹一下c 中有繼承關係的類物件記憶體的布局 在c 中,如果類中有虛函式,那麼它就會有乙個虛函式表的指標 vfptr,在類物件最開始的記憶體資料中。之後是類中的成員變數的記憶體資料。對於子類,最開始的記憶體資料記錄著父類物件的拷貝 包括父類虛函式表指標和成員變數 之後是子類...