空類:1
沒有虛函式:sizeof(資料成員)的和
有虛函式:sizeof(資料成員)的和+sizeof(v表指標);
類的大小不包含靜態資料成員大小,靜態資料存放
在靜態儲存區。
一、簡單物件
#include
class a
; };
int a::c=123;
int main()
; };
int a::c=123;
class b:public a
; };
int main()
; };
int a::c=123;
class b
; };
class c:public a,public b
;int main()
; virtual void fooa(){};
};int a::c=123;
class b:public a
; };
class c:public a
;class d:public b,public c
;int main()
; virtual void fooa(){};
};int a::c=123;
class b:virtual public a
; virtual void fooa();
int main()
; virtual void fooa(){};
};int a::c=123;
class b:virtual public a
;int main()
{ a a******;
b b******;
c c******;
d d******;
cout《綜合1,2,可見
1.非虛擬繼承時,無論派生類是否定義新的虛函式,基類和派生類總是共享乙個虛函式表,不需要另加指向虛函式的指標。
2.虛擬繼承時,若是派生類只是繼承或重寫基類中虛函式,則基類和派生類是共享乙個虛函式表;若派生類新定義了虛函式,則需要新加乙個虛指標指向新的虛函式表。
注意:在虛繼承的時候,在虛表裡還應儲存指向父類的指標。所以在上例虛擬繼承的第乙個例子中b的大小為20,12+4(int)+4(指向父類的虛指標)=20
1.class k
sizeof(k) = 1;
2. class a
int a;
void a();
sizeof(a) = 4;
3. class b
int b;
virtual void b();
sizeof(b) = 4+4;
4. class c:virtual public b
int c;
virtual void c();
sizeof(c)=4+4+4+4+4;
5. class d:virtual public b
int d;
virtual void d();
sizeof(d)=4+4+4+4+4;
6. class e:public c,public d
int e;
sizeof(e) = 4+2*(4+4+4+4+4)-4;
總結:sizeof 類 = 成員變數+虛函式指標。sizeof 繼承類 = 本身成員變數+父類的大小,如果是虛擬繼成的話,則另外加乙個指向父類指標的大小;當多重繼承的時候,如例6中,所示,這時候只需要,保留乙份指向虛基類b的指標,所以得減掉乙個指標的大小。
使用sizeof 計算類的大小
劍指offer 這本書裡第22頁有講到sizeof 計算類大小的問題,在網上查閱了一些資料,進行了一些總結。歡迎補充指正!1 類的大小 類的sizeof 大小一般是類中的所有成員的sizeof 大小之和,這個就不用多說。確切的說,用sizeof運算子對乙個型別名操作,得到的是具有該型別實體的大小。注...
sizeof 類 的大小
什麼是類的例項化,所謂類的例項化就是在記憶體中分配一塊位址 那我們先看看乙個例子 include class a class b class c public a class d public b,public c int main 程式執行的輸出結果為 sizeof a 1 sizeof b 1 ...
sizeof 類的大小
首先,類的大小是什麼?確切的說,類只是乙個型別定義,它是沒有大小可言的。用sizeof運算子對乙個型別名操作,得到的是具有該型別實體的大小。如果 class a a obj 那麼sizeof a sizeof obj 那麼sizeof a 的大小和成員的大小總和是什麼關係呢,很簡單,乙個物件的大小大...