这个问题困惑好几天了。废话不多说,先上代码。

  1 #include <iostream>   2 using namespace std;   3     4 class A   5 {   6 public:   7      virtual void aa()   8      {   9      }  10 private:  11      char k[3];  12 };  13    14 class B:public A  15 {  16 public:  17      virtual void bb()  18      {  19      }  20 private:  21      char j[3];  22 };  23    24 class C:public B  25 {  26 public:  27      virtual void cc()  28      {  29      }  30 private:  31      char i[3];  32 };  33    34 int main()  35 {  36      A a;  37      B b;  38      C c;  39      cout<<"sizeof(A):"<<sizeof(A)<<endl;  40      cout<<"sizeof(B):"<<sizeof(B)<<endl;  41      cout<<"sizeof(C):"<<sizeof(C)<<endl;  42      return 0;  43 }  44    45 打印结果:  46 sizeof(A):8//A有一个_vfptr的指向虚表的指针(4字节),加上char[3]补足是8字节。  47 sizeof(B):12//B继承A的全部(8字节),那加上char[3]补足一共是12字节,使用继承自A的_vfptr指向B的虚表 48 sizeof(C):16//同B的情况,都用A的虚函数表指针指向虚函数表。 49    50 但是如果 B、C虚继承自A  51 #include <iostream>  52 using namespace std;  53    54 class A  55 {  56 public:  57      virtual void aa()  58      {  59      }  60 private:  61      char k[3];  62 };  63    64 class B:virtual public A  65 {  66 public:  67      virtual void bb()  68      {  69      }  70 private:  71      char j[3];  72 };  73    74 class C:virtual public B  75 {  76 public:  77      virtual void cc()  78      {  79      }  80 private:  81      char i[3];  82 };  83    84 int main()  85 {  86      A a;  87      B b;  88      C c;  89      cout<<"sizeof(A):"<<sizeof(A)<<endl;  90      cout<<"sizeof(B):"<<sizeof(B)<<endl;  91      cout<<"sizeof(C):"<<sizeof(C)<<endl;  92      return 0;  93 }  94    95 在VS2008下打印结果为:  96 sizeof(A):8  97 sizeof(B):20  98 sizeof(C):32  99 而在GCC编译下,打印结果为:100 sizeof(A):8 101 sizeof(B):16102 sizeof(C):24 103   104 这是怎么得到的呢? 105   

关于虚继承这个问题,以下有几种不同的回复,上截图:

另一种:

显然,MS的VS在这方面做了一些优化,跟其他编译器相比,在派生类中插入了一个偏移值表的指针,也就多了4个字节。

通过派生类来访问虚基类的上一个从偏移值表里的获得的偏移量。VS下的内存布局如下:

|C的虚函数表指针|C的偏移表指针|C的成员变量|A的虚表指针|A的成员变量|B的虚函数表指针|B的偏移表指针|B的成员变量 。 MS为什么通过偏移表来对虚基类的成员进行寻址,我还不晓得。

现在就把摘抄的写到这里。

=我弄明白,补上。

转载于:https://www.cnblogs.com/kanego/archive/2011/11/06/2238339.html

一个虚函数和虚继承的问题。相关推荐

  1. 【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )

    文章目录 类的继承 方法的重写 子类中调用父类方法 多态 虚函数 虚函数示例 纯虚函数 相关代码 类的继承 1. 继承表示 : C++ 中继承可以使用 ":" 符号 , 格式为 & ...

  2. C++继承中的普通函数,纯虚函数、虚函数

    继承中的普通函数,纯虚函数.虚函数 C++ 在继承中虚函数.纯虚函数.普通函数,三者的区别 普通函数(no-virtual) 纯虚函数(pure virtual) 虚函数(impure virtual ...

  3. 类5-类的继承、虚函数、纯虚函数、虚析构函数

    一.类的继承 就像家谱一样,就是一个继承图.爷爷-父亲-儿子-孙子等.类也一样,上面的类称为基类,也称父类.基类下面的类叫子类也叫派生类. 子类对父类的一些属性等有所继承也有所发展,因此才有了类的继承 ...

  4. c++ map 析构函数_C++|类继承关系中的虚函数、虚析构函数、虚基类

    在继承关系中,虚函数.虚析构函数.虚基类中使用的关键字virtual都是在告诉编译器,此处要进行特殊处理: 虚函数:函数重写时的要求编译器动态绑定来实现多多态 : 虚析构函数:当基类指针指向在堆内实现 ...

  5. C++ 虚函数和虚继承解析

    本文针对C++里的虚函数,虚继承表现和原理进行一些简单分析,有不对的地方请指出.下面都是以VC2008编译器对这两种机制内部实现为例. 有喜欢或者想学习C/C++的朋友加一下我的C/C++交流群815 ...

  6. 虚函数、纯虚函数、虚基类、抽象类、虚函数继承、虚继承

    虚函数:虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的函数.是C++中多态性的一个重要体现,利用基类指针访问派生类中的成员             ...

  7. 继承----有关虚函数和虚拟继承

    可以参考以下文章: http://blog.csdn.net/haoel/archive/2007/12/18/1948051.aspx  陈皓 C++ 虚函数表解析 http://blog.csdn ...

  8. 虚函数、纯虚函数、虚继承、多继承

    来源:http://www.tnove.com/?p=57 C++的一个特征是多太,其中多态主要表现在 1.编译时多态  函数overload实现 2.运行是多态  虚函数override实现 其中虚 ...

  9. C++ 论公有继承时纯虚函数、虚函数、普通函数的行为表现及虚函数的重写(深度好文)

    文章目录 1 公有继承时三种类型的函数行为 1.1 纯虚函数 (pure virtual) 1.2 普通虚函数 **1.2.1 方法一** **1.2.2 方法二** 1.3 非虚函数 2 重写 (o ...

  10. C++中的各种“虚“-- 虚函数、纯虚函数、虚继承、虚基类、虚析构、纯虚析构、抽象类讲解

    C++中的各种"虚" 1. 菱形继承 1.1 虚继承 && 虚基类 1.2 虚基类指针(vbptr)&& 虚基类表(vbtable) 2. 多态 2 ...

最新文章

  1. 计算机考试题选择,(计算机考试题选择.doc
  2. 干货丨从概念到案例:初学者须知的十大机器学习算法
  3. JavaMail(四):接收邮件
  4. 面试精讲之面试考点及大厂真题 - 分布式专栏 20 降级组件Hystrix的功能特性
  5. java 反编译 行号对齐 decompiler如何去掉行号
  6. C++中的模板那点事
  7. 清华大学计算机音乐,校长杯十强故事汇 || DeepMusic:音乐也能如此“深邃”
  8. SEO自动外链工具推荐:站群推广利器SEO,在线批量发外链让新站快速收录
  9. unity 画球面_Unity实现球面行走
  10. CNN | 00卷积神经网络应用
  11. 斗地主 -(一) 如何开发斗地主
  12. 存储器电路设计学习记录之 buffer提高驱动能力/带负载能力
  13. 例 6.5 有一个3*4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。
  14. 智能电饭煲自动洗米手机操控一键搞定
  15. ffmpeg合并m3u8 ts key文件 解决Invalid data found when processing input错误
  16. java使用poi读取Excel2003版(.xls)
  17. 为什么?------”人的天性总是高估自己,而低估别人“
  18. C#中如何使用Chart图表
  19. sql server中如何修改视图中的数据?
  20. 分析可执行文件mach-o

热门文章

  1. MybatisPlus忽略实体类中的非数据库字段、JPA忽略实体类中的非数据库字段、HeHibernate忽略实体类中的非数据库字段
  2. js异步提交form表单的解决方案
  3. C++ 笔记(28)— C++ 中 NULL和 nullptr 的区别
  4. 2022-2028年中国可降解聚乙烯农用地膜产业竞争现状及发展规模预测报告
  5. Ubuntu 打 deb 包报错(fpm not found、dos2unix not found)
  6. Redis 高级特性(3)—— 持久化及数据恢复
  7. python实现全角和半角互相转换
  8. c语言中字符串数组的地址存放以及%s输出单个字符导致程序崩溃的问题
  9. vim中tab键8空格换4空格
  10. SpringBoot集成AOP管理日志