C++ 类的大小计算

class A
{
};

class B
{
	char ch;
	virtual void func0()  {  }
};

class C
{
	char ch1;
	char ch2;
	virtual void func()  {  }
	virtual void func1()  {  }
};

class D : public A, public C
{
	int d;
	virtual void func()  {  }
	virtual void func1()  {  }
};

class E : public B, public C
{
public:
	int e;
	virtual void func0()  {  }
	virtual void func1()  {  }
	//子类里(E)没有实现func(),所以在E的子类里B的vfptr指向C的func()和E的func1()
	virtual void func123()  {  }
}


int main()
{
        //result=1,空类,大小为1
        cout << "A=" << sizeof(A) << endl;
        
        //result=8,4(vfptr,4)+4(char ch,内存对齐,4) = 8       
	cout << "B=" << sizeof(B) << endl; 
	  
	//result=8 , 4(vfptr,4)+4(char ch1,char ch2,内存对齐,4) = 8  
	cout << "C=" << sizeof(C) << endl;    
	
	//result=12, 4(类D的vfptr,4)+4(存在基类的char ch1,char ch2,内存对齐,4)+4(int d) = 12
	D obj_d; //首先VPTR指向的虚函数表中保存的是类D中的两个虚函数的地址
	cout << "D=" << sizeof(obj_d) << endl;    
	
	
	//result=20,(多继承)继承多少个有虚函数的类,就有多少个虚函数指针,也即这几个虚函数指针组成了自己的vfptr(编译器不再单独给自己的虚函数插vfptr)
	//4(B的vfptr)+4(char ch)+4(C的vfptr)+4(C中 char ch1,char ch2)+4(E 中int d) = 20
	//这个可以从调试下看出来
	E obj_e;
	obj_e.e = 123;
	cout << "E=" << sizeof(obj_e) << endl;    

        return 0;
}


转载于:https://my.oschina.net/Yuqingmu/blog/468947

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值