sizeof() 类大小 请教

BBAPI 2011-09-21 06:47:41

class A
{
public:
int a1;
virtual void f1(){}
};
class B
{
public:
int b1;
virtual void f2(){}
};
class C:public A,public B
{
public:
int c1;
void f1(){cout<<"...C..."<<endl;}
};

请教,为何sizeof(C)==20?我是这么理解,A:8,B:8,C = 8 + 8 + 4 + 4,可结果为。。。
...全文
182 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
BBAPI 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 chiyer 的回复:]

引用 12 楼 bbapi 的回复:

引用 6 楼 mymgrub 的回复:

虚拟函数的表头是单独存储的,f1是非虚函数,当然要占个函数指针的位置喽...

A 中f1 为虚函数,C 继承A,f1应该也为虚函数吧?


对,只要在基类是虚的,就是虚的,你要深入理解的话:google : 重载,覆盖,隐藏
[/Quote]
嗯,多谢!
星羽 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 bbapi 的回复:]

引用 6 楼 mymgrub 的回复:

虚拟函数的表头是单独存储的,f1是非虚函数,当然要占个函数指针的位置喽...

A 中f1 为虚函数,C 继承A,f1应该也为虚函数吧?
[/Quote]

对,只要在基类是虚的,就是虚的,你要深入理解的话:google : 重载,覆盖,隐藏
MYMGrub 2011-09-21
  • 打赏
  • 举报
回复
刚试了下,很神奇,很SORRY,竟然和我想的不一样...受教了..
yakeezhao 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mymgrub 的回复:]

他的实现都放在这了,没有这个指针怎么找他哩?
[/Quote]

我想我没说明白。不是说f1没有一个地址指向它(要不然它就没法调用了),而是说sizeof的时候这种非虚函数不占用C的空间。 (汗,可能还是没说明白)

你可以写一个仅有一个非虚函数的类,调用它的sizeof试一下啦。
BBAPI 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 chiyer 的回复:]

每个父类都有自己的虚表。

子类的成员函数被放到了第一个父类的表中,无单独虚表。(所谓的第一个父类是按照声明顺序来判断的)

所以大小是
3个int+2个虚表 = 12 + 8 = 20
[/Quote]
是我想要的!
BBAPI 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yakeezhao 的回复:]

“为何sizeof(C)==20?我是这么理解,A:8,B:8,C = 8 + 8 + 4 + 4,可结果为。。。”
我想,你之所以会“+ 4 + 4”是因为“int c1;”占4,而另一个4,你认为是虚表指针吧?
其实“sizeof(C)==20”是因为“A:8,B:8,C = 8 + 8 + 4”, C不再有一个单独的虚表指针了
[/Quote]解决了我困惑!
BBAPI 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 mymgrub 的回复:]

虚拟函数的表头是单独存储的,f1是非虚函数,当然要占个函数指针的位置喽...
[/Quote]
A 中f1 为虚函数,C 继承A,f1应该也为虚函数吧?
qq120848369 2011-09-21
  • 打赏
  • 举报
回复
管他的。
星羽 2011-09-21
  • 打赏
  • 举报
回复
每个父类都有自己的虚表。

子类的成员函数被放到了第一个父类的表中,无单独虚表。(所谓的第一个父类是按照声明顺序来判断的)

所以大小是
3个int+2个虚表 = 12 + 8 = 20
yakeezhao 2011-09-21
  • 打赏
  • 举报
回复
“为何sizeof(C)==20?我是这么理解,A:8,B:8,C = 8 + 8 + 4 + 4,可结果为。。。”
我想,你之所以会“+ 4 + 4”是因为“int c1;”占4,而另一个4,你认为是虚表指针吧?
其实“sizeof(C)==20”是因为“A:8,B:8,C = 8 + 8 + 4”, C不再有一个单独的虚表指针了
MYMGrub 2011-09-21
  • 打赏
  • 举报
回复
他的实现都放在这了,没有这个指针怎么找他哩?
yakeezhao 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 mymgrub 的回复:]

虚拟函数的表头是单独存储的,f1是非虚函数,当然要占个函数指针的位置喽...
[/Quote]


f1是非虚函数,它不占什么函数指针的位置
MYMGrub 2011-09-21
  • 打赏
  • 举报
回复
虚拟函数的表头是单独存储的,f1是非虚函数,当然要占个函数指针的位置喽...
BBAPI 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mymgrub 的回复:]

那个void*是指的虚函数表头的那个指针,另外老大,4*5!=16啊...
[/Quote]
不是,我意思是:既然“那个void*是指的虚函数表头的那个指针”,为何还要sizeof(f1)?
MYMGrub 2011-09-21
  • 打赏
  • 举报
回复
那个void*是指的虚函数表头的那个指针,另外老大,4*5!=16啊...
BBAPI 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mymgrub 的回复:]

sizeof(a1) + sizeof(b1) + sizeof(c1) + sizeof(f1) + sizeof(void*)
两个虚函数只有一个虚函数列表的指针
欢迎指正
[/Quote]
sizeof(void*)?
BBAPI 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mymgrub 的回复:]

sizeof(a1) + sizeof(b1) + sizeof(c1) + sizeof(f1) + sizeof(void*)
两个虚函数只有一个虚函数列表的指针
欢迎指正
[/Quote]
那就应该是16了吧?
MYMGrub 2011-09-21
  • 打赏
  • 举报
回复
sizeof(a1) + sizeof(b1) + sizeof(c1) + sizeof(f1) + sizeof(void*)
两个虚函数只有一个虚函数列表的指针
欢迎指正

64,654

社区成员

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

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