免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4079 | 回复: 15
打印 上一主题 下一主题

派生类中有虚函数,关于派生类的sizeof问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-27 09:34 |只看该作者 |倒序浏览
5可用积分
  1. #include <iostream>
  2. using namespace std;
  3. class A
  4. {
  5.         public:
  6.                 A()
  7.         {
  8.                 cout<<"A()"<<endl;
  9.         }
  10.         virtual void func1()
  11.         {
  12.         }
  13.         private:
  14.                 int n;          
  15. };
  16. class B:public A
  17. {
  18.         public:
  19.                 B()
  20.         {
  21.                 cout<<"B()"<<endl;
  22.         }
  23.         virtual void func2()
  24.         {
  25.         }
  26. };
  27. int  main()
  28. {
  29.         cout<<sizeof(A)<<endl;
  30.         cout<<sizeof(B)<<endl;
  31.         return 0;
  32. }
复制代码

sizeof(B)结果是8,为什么不是12呢?

最佳答案

查看完整内容

这种情况基类与派生类公用一个虚函数表

论坛徽章:
0
2 [报告]
发表于 2008-08-27 09:34 |只看该作者
这种情况基类与派生类公用一个虚函数表

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
3 [报告]
发表于 2008-08-27 09:49 |只看该作者

回复 #1 kewenliang 的帖子

sizeof(A)的结果是多少呢?

论坛徽章:
0
4 [报告]
发表于 2008-08-27 10:00 |只看该作者
int n 4位
有虚函数,所以有虚表 4位

成员函数不影响sizeof

所以sizeof(A)和sizeof(B)都是8

论坛徽章:
0
5 [报告]
发表于 2008-08-27 11:19 |只看该作者
将B中的virtual void func2()
        {
        }
改为virtual void func1()
        {
        }
结果仍是8啊
并且B中也有虚函数啊

论坛徽章:
0
6 [报告]
发表于 2008-08-27 11:28 |只看该作者
原帖由 kewenliang 于 2008-8-27 11:19 发表
将B中的virtual void func2()
        {
        }
改为virtual void func1()
        {
        }
结果仍是8啊
并且B中也有虚函数啊



所有虚函数公用一个虚表,所以都是8

论坛徽章:
0
7 [报告]
发表于 2008-08-27 13:26 |只看该作者
原帖由 kewenliang 于 2008-8-27 11:19 发表
将B中的virtual void func2()
        {
        }
改为virtual void func1()
        {
        }
结果仍是8啊
并且B中也有虚函数啊


对象里只有vptr,4个字节;
类A的vtable有一个函数,类B的vtable有两个函数;
sizeof算的是对象大小

论坛徽章:
0
8 [报告]
发表于 2008-08-27 18:14 |只看该作者
原帖由 gego 于 2008-8-27 09:34 发表
这种情况基类与派生类公用一个虚函数表

害人不是~~~基类和派生类有各自的虚函数表(为实现多态提供条件)
LZ估计没有理解这一点:有虚函数的类的对象中保存有指向该类的虚函数表的指针(如果是多重继承,可能有多个),虚函数表本身并不占用类对象的存储空间

论坛徽章:
0
9 [报告]
发表于 2008-08-27 19:53 |只看该作者
tyc611说的是对的。
类A中n占了4个字节,虚函数指针占了4个字节,所以sizeof的结果是8
类B中继承A中的n占了4个字节,还有虚函数指针占了4个字节,所以结果也是8

论坛徽章:
0
10 [报告]
发表于 2008-08-27 20:01 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP