一个虚函数和虚继承的问题。
这个问题困惑好几天了。废话不多说,先上代码。
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
一个虚函数和虚继承的问题。相关推荐
- 【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )
文章目录 类的继承 方法的重写 子类中调用父类方法 多态 虚函数 虚函数示例 纯虚函数 相关代码 类的继承 1. 继承表示 : C++ 中继承可以使用 ":" 符号 , 格式为 & ...
- C++继承中的普通函数,纯虚函数、虚函数
继承中的普通函数,纯虚函数.虚函数 C++ 在继承中虚函数.纯虚函数.普通函数,三者的区别 普通函数(no-virtual) 纯虚函数(pure virtual) 虚函数(impure virtual ...
- 类5-类的继承、虚函数、纯虚函数、虚析构函数
一.类的继承 就像家谱一样,就是一个继承图.爷爷-父亲-儿子-孙子等.类也一样,上面的类称为基类,也称父类.基类下面的类叫子类也叫派生类. 子类对父类的一些属性等有所继承也有所发展,因此才有了类的继承 ...
- c++ map 析构函数_C++|类继承关系中的虚函数、虚析构函数、虚基类
在继承关系中,虚函数.虚析构函数.虚基类中使用的关键字virtual都是在告诉编译器,此处要进行特殊处理: 虚函数:函数重写时的要求编译器动态绑定来实现多多态 : 虚析构函数:当基类指针指向在堆内实现 ...
- C++ 虚函数和虚继承解析
本文针对C++里的虚函数,虚继承表现和原理进行一些简单分析,有不对的地方请指出.下面都是以VC2008编译器对这两种机制内部实现为例. 有喜欢或者想学习C/C++的朋友加一下我的C/C++交流群815 ...
- 虚函数、纯虚函数、虚基类、抽象类、虚函数继承、虚继承
虚函数:虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的函数.是C++中多态性的一个重要体现,利用基类指针访问派生类中的成员 ...
- 继承----有关虚函数和虚拟继承
可以参考以下文章: http://blog.csdn.net/haoel/archive/2007/12/18/1948051.aspx 陈皓 C++ 虚函数表解析 http://blog.csdn ...
- 虚函数、纯虚函数、虚继承、多继承
来源:http://www.tnove.com/?p=57 C++的一个特征是多太,其中多态主要表现在 1.编译时多态 函数overload实现 2.运行是多态 虚函数override实现 其中虚 ...
- C++ 论公有继承时纯虚函数、虚函数、普通函数的行为表现及虚函数的重写(深度好文)
文章目录 1 公有继承时三种类型的函数行为 1.1 纯虚函数 (pure virtual) 1.2 普通虚函数 **1.2.1 方法一** **1.2.2 方法二** 1.3 非虚函数 2 重写 (o ...
- C++中的各种“虚“-- 虚函数、纯虚函数、虚继承、虚基类、虚析构、纯虚析构、抽象类讲解
C++中的各种"虚" 1. 菱形继承 1.1 虚继承 && 虚基类 1.2 虚基类指针(vbptr)&& 虚基类表(vbtable) 2. 多态 2 ...
最新文章
- 计算机考试题选择,(计算机考试题选择.doc
- 干货丨从概念到案例:初学者须知的十大机器学习算法
- JavaMail(四):接收邮件
- 面试精讲之面试考点及大厂真题 - 分布式专栏 20 降级组件Hystrix的功能特性
- java 反编译 行号对齐 decompiler如何去掉行号
- C++中的模板那点事
- 清华大学计算机音乐,校长杯十强故事汇 || DeepMusic:音乐也能如此“深邃”
- SEO自动外链工具推荐:站群推广利器SEO,在线批量发外链让新站快速收录
- unity 画球面_Unity实现球面行走
- CNN | 00卷积神经网络应用
- 斗地主 -(一) 如何开发斗地主
- 存储器电路设计学习记录之 buffer提高驱动能力/带负载能力
- 例 6.5 有一个3*4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。
- 智能电饭煲自动洗米手机操控一键搞定
- ffmpeg合并m3u8 ts key文件 解决Invalid data found when processing input错误
- java使用poi读取Excel2003版(.xls)
- 为什么?------”人的天性总是高估自己,而低估别人“
- C#中如何使用Chart图表
- sql server中如何修改视图中的数据?
- 分析可执行文件mach-o
热门文章
- MybatisPlus忽略实体类中的非数据库字段、JPA忽略实体类中的非数据库字段、HeHibernate忽略实体类中的非数据库字段
- js异步提交form表单的解决方案
- C++ 笔记(28)— C++ 中 NULL和 nullptr 的区别
- 2022-2028年中国可降解聚乙烯农用地膜产业竞争现状及发展规模预测报告
- Ubuntu 打 deb 包报错(fpm not found、dos2unix not found)
- Redis 高级特性(3)—— 持久化及数据恢复
- python实现全角和半角互相转换
- c语言中字符串数组的地址存放以及%s输出单个字符导致程序崩溃的问题
- vim中tab键8空格换4空格
- SpringBoot集成AOP管理日志