嚴謹宣告以下結論均為gcc編譯和unix 64位系統環境下得出的結論,非gcc和unix環境結論部分結論可能有所不同
1.c++類成員變數分為兩部分:類自身宣告的成員變數,來自於基類的成員變數
2.成員變數在記憶體中的順序和宣告順序保持一致,從低位址向高位址擴充套件
3.直接繼承的情況下, 基類成員變數的位址,在子類成員變數的位址之前;
4.虛繼承的情況下,基類成員變數的位址,在子類成員變數的位址之後;
5.虛函式表指標,處於所有物件指標之前
完整的驗證**:
#includeusing namespace std;
class base;};
class a: public base;};
int main()
{ a obj;
cout<<"address obj:"<<&obj《有虛函式的情況下輸出(64位的環境,乙個指標佔8個位元組):
address obj:0x7ffee9fe99b0 #(物件起始位址)
address base_a:0x7ffee9fe99b8 #(基類的乙個成員變數起始位址)
address a:0x7ffee9fe99bc #(子類的第乙個成員變數起始位址)
address b:0x7ffee9fe99c0 #(子類的第二個成員變數起始位址)
address c:0x7ffee9fe99c4 #(子類的第三個成員變數起始位址)
address obj:0x7ffeec0d39c0 #(物件起始位址)
address base_a:0x7ffeec0d39c0 #(基類的乙個成員變數起始位址)
address a:0x7ffeec0d39c4
address b:0x7ffeec0d39c8
address c:0x7ffeec0d39cc
所以可以猜想虛函式指標被編譯器安插在了物件的頭部,指標占用固定長度位元組。
虛繼承的情況下程式輸出:
address obj:0x7ffee15359b0 #(物件起始位址)
address base_a:0x7ffee15359c4 #(基類成員變數在最後)
address a:0x7ffee15359b8 #(子類的第乙個成員變數起始位址)
address b:0x7ffee15359bc #(子類的第二個成員變數起始位址)
address c:0x7ffee15359c0 #(子類的第三個成員變數起始位址)
C 類的儲存結構
c 類的儲存 部分可用與c 的結構體 c 中最重要的就是類,那麼給你乙個類的物件,你知道它在記憶體中如何儲存的嗎?它佔 記憶體中多少個位元組?首先確定類的構成 1,資料成員 可以是內建型別,類型別。2,函式成員 虛函式,非虛函式 1 資料成員 內建型別對齊原則 內建型別就是常用的 char,shor...
C 類和物件,結構體
趁著中秋放假要多補補知識了,感覺自己對c 了解的不夠紮實,為了更好的工作,只好再來看看。c和c 規定可以用乙個結構體,裡面即可有陣列,也可以有其他變數。c中成員只能是資料,c 除了資料,還可以是函式。但是,c 提供了類這個東西,所以不需要包含函式的結構體。1,結構體 include using na...
C 類與物件探秘 結構體實現類
在c 中,class和struct幾乎沒有區別,非要說有區別,就是預設訪問許可權的區別,class預設私有,struct預設公有,這回主要通過c語言的結構體來了解一下c 類和物件的一些原理。結構體中,可以放變數,還有函式宣告,這裡設定不將函式宣告寫在結構體中。演示類1 struct animal v...