继承与虚继承中内存结构的问题

yuwei19840916 2009-03-05 11:04:15
下面的两段程序代码,麻烦解释下其内存的结构,具体看代码中的问号处。
#include <iostream>
using namespace std;

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 *agrv[])
{
A a;
B b;
C c;
cout<<"sizeof(A)"<<sizeof(a)<<endl;//为什么是8
cout<<"sizeof(B)"<<sizeof(b)<<endl;//为什么是12
cout<<"sizeof(C)"<<sizeof(c)<<endl;//为什么是16
return 0;
}

第二段代码
#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 *agrv[])
{
A a;
B b;
C c;
cout<<"sizeof(A)"<<sizeof(a)<<endl;//为什么是8
cout<<"sizeof(B)"<<sizeof(b)<<endl;//为什么是20
cout<<"sizeof(C)"<<sizeof(c)<<endl;//为什么是32
return 0;
}

...全文
180 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lclhurricane 2009-03-05
  • 打赏
  • 举报
回复
楼主可以看一下《inside the c++ Object model》中的“The Semantics of Data”一节。涉及到编译器的问题。
WillyWonka 2009-03-05
  • 打赏
  • 举报
回复
会用就行了,别给自己找麻烦了,钻牛角尖啊..
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 arong1234 的回复:]
这个随编译器不同可能有变化得
没有必要去研究他得具体布局
也不要依赖他得具体布局去写代码
[/Quote]

楼主想得太多了..
lingyin55 2009-03-05
  • 打赏
  • 举报
回复
大小不同的原因应该是要保存虚函数表引起的,而且你的类的继承是C->B->A,这样c中需要保存的虚函数表的大小应该会大于c直接从A继承需要保存的虚函数表,从而引起所需内存空间大小的不同。

[Quote=引用楼主 yuwei19840916 的帖子:]
下面的两段程序代码,麻烦解释下其内存的结构,具体看代码中的问号处。
#include <iostream>
using namespace std;

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 *agrv[])
{
A a;
B b;
C c;
c…
[/Quote]
arong1234 2009-03-05
  • 打赏
  • 举报
回复
这个随编译器不同可能有变化得
没有必要去研究他得具体布局
也不要依赖他得具体布局去写代码
pengzhixi 2009-03-05
  • 打赏
  • 举报
回复
cout < <"sizeof(A)" < <sizeof(a) < <endl;//为什么是8
cout < <"sizeof(B)" < <sizeof(b) < <endl;//为什么是20
cout < <"sizeof(C)" < <sizeof(c) < <endl;//为什么是32

我估计这个编译器的内存布局是这样的,A是8就不解释了,B:20 在8的基础上加上B的虚函数表指针4,char成员3+1(对齐)+virtual base calss pointer(to A) 也就是8+4+3+1+4=20
C:在B的基础上+虚函数表指针(4)+char成员3+1(对齐)+virtual base calss pointer(to B)=20+4+4+4=32;
pengzhixi 2009-03-05
  • 打赏
  • 举报
回复
注意虚拟继承的话还得多一个virtual base calss pointer用来保证虚基类始终只有一个.
pengzhixi 2009-03-05
  • 打赏
  • 举报
回复
sizeof(a)为8:4+3+1=8 4是虚函数表指针占4个字节,3就是char占的3个字节,1用来对齐.
sizeof(b)为12:在A大小的基础上加上3再加1,加3是因为B的数据成员char[3];1用来对齐,注意B的虚函数表指针指向的是类B的虚函数表.
同样的c就不解释了.
第2段的话,虚拟继承就比较麻烦.各个编译起处理的方式不同.
lq651659889 2009-03-05
  • 打赏
  • 举报
回复
学习

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧