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)
由此可知,虚函数在类中占据四个字节,且子类共享父类的虚函数空间。(即若父类中有虚函数,子类不再为虚函数分配空间,但若父类无虚函数而子类有,则在子类中为虚函数分配空间)
-------------- 呵呵,很笨的方法,不晓得是否正确,如果有问题,还请指教 -------------------------