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...