返回信息流声明用VS2008。gcc结果可能不一样。
不用虚拟继承
class A
{
char k[3];
public :
virtual void aa(){};
};
class B: public A
{
char j[3];
public :
virtual void bb(){};
};
class C:public B
{
char i[3];
public :
virtual void cc(){};
};
int main(int argc, char* argv[])
{
cout<<"sizeof(A):"<<sizeof(A)<<endl;
cout<<"sizeof(B):"<<sizeof(B)<<endl;
cout<<"sizeof(C):"<<sizeof(C)<<endl;
return 0;
}
sizeof(A):8
sizeof(B):12
sizeof(C):16
用了虚拟继承
#include <iostream>
using namespace std;
class A
{
char k[3];
public :
virtual void aa(){};
};
class B: public virtual A
{
char j[3];
public :
virtual void bb(){};
};
class C:public virtual B
{
char i[3];
public :
virtual void cc(){};
};
int main(int argc, char* argv[])
{
cout<<"sizeof(A):"<<sizeof(A)<<endl;
cout<<"sizeof(B):"<<sizeof(B)<<endl;
cout<<"sizeof(C):"<<sizeof(C)<<endl;
return 0;
}
sizeof(A):8
sizeof(B):20
sizeof(C):32
不用虚拟继承好理解。用了为什么差值为12呢?
网上找的资料为:
虚继承时子类需要维护一个Vptr的指针,所以即使虚基类为空,子类也会为vptr分配一个4字节(可能与各编译器有关)大小的空间。
这是一条镜像帖。来源:北邮人论坛 / cpp / #16996同步于 2008/12/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于虚拟继承对sizeof结果的影响。
lodas
2008/12/1镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
【 在 lodas 的大作中提到: 】
: 声明用VS2008。gcc结果可能不一样。
: 不用虚拟继承
: class A
: ...................
没次虚继承derived class都会增加一个指向base的指针用来解决“固定存取时间问题”
对于此问题,深入解析c++对象模型中有详解
【 在 lodas 的大作中提到: 】
: 声明用VS2008。gcc结果可能不一样。
: 不用虚拟继承
: class A
: ...................
给你个链接看看:
http://dev.csdn.net/article/41/41967.shtm
恩,好好看看。
【 在 bird 的大作中提到: 】
: 给你个链接看看:
: http://dev.csdn.net/article/41/41967.shtm