class CMember1 {
public:
CMember1(){a=0x5678;printf("構造 CMember1 ");}
~CMember1(){printf("析構 CMember1 ");}
int a;
};
class CParent1 {
public:
CParent1(){parent_data=0x1234;printf("構造 CParent1 ");}
virtual ~CParent1(){printf("析構 CParent1 ");}
virtual void test(){printf("調用CParent1::test() ");}
void real(){printf("調用CParent1::test() ");}
int parent_data;
};
class CChild1 : public CParent1 {
public:
CChild1(){printf("構造 CChild1 ");}
~CChild1(){printf("析構 CChild1 ");}
void test(){printf("調用CChild1::test() ");}
void real(){printf("調用CChild1::test() ");}
CMember1 member;
static int b;
};
int main()
{
int aa = sizeof(CChild1);
printf("CChild1------%d ",sizeof(aa));
int bb = sizeof(CParent1);
printf("CParent1------%d ",sizeof(bb));
int cc = sizeof(CMember1);
printf("CMember1------%d ",sizeof(cc));
CMember1 member1;
CParent1 CParent0;
CChild1 CChild;
printf("member1------%d ",sizeof(member1));
printf("CParent0------%d ",sizeof(CParent0));
printf("CChild1 cc------%d ",sizeof(CChild));
return 0;
}
輸出結果如上面::
結構體聲明(定義)的時候不分配內存空間,但是類聲明(定義的時候),其中的數據成員變量分配空間(包括靜態成員變量和非靜態成員變量),但函數不分配空間。4 Menber ;4 Cparent1 ; 4 Cchild1;
類實例化的時候,靜態成員變量不佔據空間,(共享類定義時候的空間,節省內存資源),實例類的內存使其父類和成員類數據成員的空間及其虛函數所佔的空間(虛函數佔據四個字節,爲其虛函數表指針數組所佔用),
12=4(menber)+8(parent1), 8=4(parent_data)+4(vptr)
若去掉子類中 static 聲明,即Cchild1中爲: int b; 結果如下圖
16= 4 +8 +4 member+parent_data + parent virtual + int b
若去掉父類中的 virtual 函數生命變爲非虛函數,則子類實例中的數字不變化,即 Cchild cc = 12. 12=4+4+4 menber+ parent_data + cc virtual
若將子類和父類中的虛函數全部都變爲普通成員函數,則輸出結果爲 Cchild cc = 8. 8=4+4( member+parent_data)
由此可知,虛函數在類中佔據四個字節,且子類共享父類的虛函數空間。(即若父類中有虛函數,子類不再爲虛函數分配空間,但若父類無虛函數而子類有,則在子類中爲虛函數分配空間)
-------------- 呵呵,很笨的方法,不曉得是否正確,如果有問題,還請指教 -------------------------