CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

求:用了虚基类继承后派生类的 sizeof()结果分析

楼主theseus_wu(感悟人生)2005-06-04 18:58:53 在 C/C++ / C++ 语言 提问

简单的调试程序如下:  
   
  #include   <iostream.h>  
   
  class   a  
  {  
  private:  
  int   x;  
  };  
   
   
   
  class   b:   virtual   public   a  
  {  
  private:  
  int   y;  
  };  
   
  class   c:   virtual   public   a  
  {  
  private:  
  int   z;  
  };  
   
  class   d:public   b,public   c  
  {  
  private:  
  int   m;  
  };  
  int   main(int   argc,   char*   argv[])  
  {  
  cout<<sizeof(a)<<endl;  
  cout<<sizeof(b)<<endl;  
  cout<<sizeof(c)<<endl;  
  cout<<sizeof(d)<<endl;  
  return   0;  
  }  
   
  在VC6.0下调试结果为  
  4  
  12  
  12  
  24  
   
  有哪位高手能解释一下结果,特别是b、c、d的结果 问题点数:20、回复次数:13Top

1 楼evanmengcn(evan)回复于 2005-06-04 19:13:47 得分 5

去看Inside   C++   Object   Model就全明白了。Top

2 楼sunman1982(冥王星)回复于 2005-06-04 19:15:15 得分 0

mark!!!-_-!!Top

3 楼evanmengcn(evan)回复于 2005-06-04 19:28:00 得分 0

啊……应该是Inside   The   C++   Object   Model……  
   
  惭愧惭愧…………Top

4 楼horisly(SUN YAT-SEN UNIVERSITY (逸仙先生))回复于 2005-06-04 20:05:13 得分 10

虚继承的子类都要包含一个指向基类的指针,从而实现动态联编的。  
  所以:  
  b{x,y,pvtr_a}   ---->4*3=12  
  c{x,z,pvtr_a}   ---->4*3=12  
  d{x,y,z,m,pvtr_b,pvtr_c,pvtr_a}     //虚继承只保留一份公共基类的数据。   --->   4*6=24  
  Top

5 楼horisly(SUN YAT-SEN UNIVERSITY (逸仙先生))回复于 2005-06-04 20:05:50 得分 0

你如果把这两个virtual去掉的话,就可以比较到不同了Top

6 楼chinaren2k(康康)回复于 2005-06-04 20:11:10 得分 0

虚函数其实是一个指针    
  站4位Top

7 楼theseus_wu(感悟人生)回复于 2005-06-04 21:17:03 得分 0

我也是怀疑有指针传入,但不敢肯定,呵呵  
   
  还有一个问题,this指针为什么没算进去啊?Top

8 楼qhfu(改个名字)回复于 2005-06-04 21:58:39 得分 5

函数并不占用类的空间吧!   数据才占   空间,这是我的理解,     不知道有没有理解错   ,    
  如果是一个多太类,   会有一个vptr     指向虚函数   表Top

9 楼foochow(无聊,灌水......)回复于 2005-06-04 22:56:43 得分 0

楼主程序中少了一个纯虚函数吧,随便加个就可以看出不同,要不你改成public也可以比较出不同Top

10 楼sankt(宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒.)回复于 2005-06-04 23:06:56 得分 0

学习  
  Top

11 楼theseus_wu(感悟人生)回复于 2005-06-04 23:09:42 得分 0

我用的是虚基类,又不是抽象基类,为什么要在基类中加纯虚函数啊??  
  我讨论的是在虚基类继承下,编译器为对象开辟多少内存空间的问题。还没和函数打交道。Top

12 楼qhfu(改个名字)回复于 2005-06-04 23:15:50 得分 0

虚继承   还有个   vbtr   表Top

13 楼foochow(无聊,灌水......)回复于 2005-06-05 00:17:21 得分 0

嘿嘿,搞错了,   horisly(SUN   YAT-SEN   UNIVERSITY   (逸仙先生))   解释得很清楚了^_^Top

相关问题

  • Dao的继承类的派生问题
  • 继承(派生、重载)类的问题
  • 派生与继承!!!
  • 静态类成员在派生类中是否会被继承?
  • 如何创建继承两个类的派生类?
  • 关于派生类继承基类底一个问题:
  • 菱形虚拟继承后,派生类的大小问题
  • 多重继承时,派生类的VTable问题
  • 继承CStatic,结果派生类里的WM_CTLCOLOR触发不了??????
  • CView的派生类可以进行多重继承吗?

关键词

  • virtual
  • pvtr
  • 基类
  • 继承
  • 虚函数
  • 空间
  • 不同
  • private

得分解答快速导航

  • 帖主:theseus_wu
  • evanmengcn
  • horisly
  • qhfu

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo