請寫出sizeof的運算結果
程式1
classbase
};class derived1:public
base
};class derived2:public
virtual
base
};sizeof
(base);
sizeof
(derived1);
sizeof(derived2);
答案:1, 1, 4
問題分析:
base類沒有任何資料成員,但是base類的物件占用的空間卻不是0,由於物件儲存在記憶體中,不占用空間的物件在記憶體中無法標識,因此base類的物件在記憶體中會有乙個佔位符,占用空間為1個位元組。
derived1類繼承base類,沒有任何資料成員,因此derived1類的物件也只有乙個佔位符,占用空間為1個位元組。
derived2類虛繼承base類,沒有任何資料成員,但是由於虛繼承的關係,derived2類的物件中會有乙個指向虛基類base的指標,指標占用的空間為4個位元組,因此derived2類的物件占用空間為4個位元組。
程式2
classbase
};class derived1:public
base
};class derived2:public
base
};class derived3:public
virtual
base
};sizeof
(base);
sizeof
(derived1);
sizeof
(derived2);
sizeof(derived3);
答案:4, 4, 4, 8(gcc)或12(vc)
問題分析:
base 類中沒有任何資料成員,但是由於base類中有虛函式,base類的物件中會有乙個指向虛函式表的指標,因此base類的物件占用空間為4個位元組。
derived1類繼承base類,沒有任何資料成員,但是derived1類繼承了base類中的虛函式,使得derived1類的物件中也含有乙個指向虛函式表的指標,因此derived1類的物件占用空間為4個位元組。
derived2類繼承base類,沒有任何資料成員,但是derived2類不但繼承了base類的虛函式,還有自己的虛函式,這兩個虛函式關聯同乙個虛函式表,因此derived2類的物件中只有乙個指向虛函式表的指標,占用4個位元組。
derived3類虛繼承base類,這個情況比較複雜,不同編譯器的實現不同。這裡只分析一下主流的vc編譯器和gcc編譯器。
對於vc編譯器來說,虛繼承中父類和子類不共享指向虛函式表的指標,因此derived3類的物件中有三個指標:指向base類虛函式表的指標,指向derived3類虛函式表的指標,指向虛基類base的指標,總共占用空間為12個位元組。
對於gcc編譯器來說,無論普通繼承還是虛繼承,任何物件只有乙個指向虛函式表的指標,因此derived3類的物件中有兩個指標:指向虛函式表的指標,指向虛基類base的指標,總共占用空間為8個位元組。
使用sizeof計算虛繼承的類物件的空間大小
include using namespace std class a class b class c public a,public b class d virtual public a class e virtual public a,virtual public b class f int f...
C 中虛函式繼承類的記憶體占用大小計算
位元組對齊的原理見鏈結注意64位系統虛函式指標佔8位元組,32位佔4位元組 原帖中寫到 求sizeof d 的時候,需要明白,首先vptr指向的虛函式表中儲存的是類d中的兩個虛函式的位址 只有乙個虛基類位址指標 然後存放基類c中的兩個資料成員ch1 ch2,注意記憶體對齊,然後存放資料成員d,這樣4...
C 中虛函式繼承類的記憶體占用大小計算
例子一 class a class b class c virtual void func1 class d public a,public c virtual void func1 class e public b,public c virtual void func1 int main void...