3 4 C 四種繼承關係中記憶體分布

2021-07-22 07:02:25 字數 2258 閱讀 6627

1、單一繼承不含虛函式

在這種情況下,物件會保持基類的原樣性,並且乙個class derived class object表現出來的東西,是其自己的members加上其base classes members的總和。

class point2d

;class point3d : public point2d

;

對於上述類,其模型如下:

2、單一繼承含虛函式

與單一繼承不含虛函式唯一不同的是,在含有虛函式時,vptr放置的位置。如果vptr放置在起始位置處,則會表現出非自然多型。如果在在尾處,則可以自然多型。下面是乙個構造的具有虛函式的繼承類。

class point2d

;class point3d : public point2d

};class point4d : public point3d

};

對於上述類,其模型如下:

3、多重繼承

多重繼承的問題主要發生於derived class objects和其第二或後繼的base class之間的轉換。他的記憶體分布其實各個部分相加再加上自己的部分。

class point3d

};class vertex

};class vertex3d : public point3d, public vertex

;

對於這個類,它們的模型是:

在這個模型中,型別轉換是如何發生的呢?

point3d* ptrp3d1;

vertex* ptrvtx1;

vertex3d* ptrvtx3d1;

vertex3d vtx3d1;

ptrp3d1 = &vtx3d1;//自然多型,不需要編譯器參與

ptrvtx1 = &vtx3d1;//非自然多型,需要編譯器引數 ptrvtx1 = (vertex*)((char*)(&vtx3d1)+sizeof(point3d));

ptrvtx3d1 = &vtx3d1;

ptrvtx1 = ptrvtx3d1;//非自然多型,需要編譯器 ptrvtx1 =ptrvtx3d1?(vertex*)((char*)(ptrvtx3d1)+sizeof(point3d)):0

4、虛擬繼承class如果內含乙個或多個virtual base class subobjects,將被分割成兩部分:乙個不變區域和乙個共享區域。共享區域指的是virtual base class subobject這一部分,其位置會因為每次的派生操作而有變化。

下面我將分析一組虛擬派生繼承,以及它在vs中的記憶體分布。**如下:

class point

;class point2d : public virtual point

;class point3d : public virtual point2d

};class vertex : public virtual point2d

};class vertex3d : public point3d, public vertex

;

在這段**中,其所構造的模型如下:

這是我根據在vs2015中根據類大小進行判斷的,這個模型最大的壞處是:隨著虛擬繼承鏈的加長,導致間接訪問層次的增加。

C 中四種記憶體分配方式

四種記憶體分配方式 1.堆heap 程式設計師手動分配和釋放的,malloc free,new delete 2.棧stack 由編譯器自動分配和釋放,用於存放區域性變數和引數 3.全域性 靜態區 存放全域性變數和靜態變數,在程式編譯時分配 4.文字常量區 存放常量字串 stack和heap的比較 ...

C 中四種排序演算法

氣泡排序 using system namespace bubblesorter public class mainclass bubblesorter sh new bubblesorter sh.sort iarrary for int m 0 m iarrary.length m consol...

C 中四種引數傳遞

using system using system.data using system.configuration using system.web using system.web.security using system.web.ui using system.web.ui.webcontro...