探究继承+virtual与不加virtual在对象内存中的分配
来源:互联网 发布:大华监控软件电视 编辑:程序博客网 时间:2024/04/29 19:30
第一个没有加 virtual
class A{public: int _a;};class B : public A{public: int _b;};class C : public A{public: int _c;};class D : public C, public B{public: int _d;};int main(){ D dd; cout<<sizeof(dd)<<endl; dd.B::_a = 1; dd._b = 3; dd.C::_a = 2; dd._c = 4; dd._d = 5;
第二个没加virtual
class A{public: int _a;};class B : virtual public A{public: int _b;};class C : virtual public A{public: int _c;};class D : public C, public B{public: int _d;};int main(){ D dd; cout<<sizeof(dd)<<endl; dd.B::_a = 1; dd._b = 3; dd.C::_a = 2; dd._c = 4; dd._d = 5;
第一个没有加virtual 开辟空间是20,这是我们意料之中的事,
第二个加了virtual 为什么就变成24 了呢,这值得探究,接下来我们通过调试与监视窗口,内存窗口,得出结论 如下图;
可以得出,加了virtual之后,编译器将_a 单独放在最后面,B和C 都有4个字节来存本身的值,还另外有4个字节存着某个地址,通过查找,知道这两个地址都保存的是0;但是下一个地址分别保存0x 0c 00 00 00 ,和0x 14 00 00 00 ,所以一推测出保存的为偏移量地址,从当前位置分别偏移12 和20 个字节恰好能找到 _a ,感觉好神奇,有没有?至于为什么这么保存请听下回分解。
1 0
- 探究继承+virtual与不加virtual在对象内存中的分配
- 继承与virtual
- 继承(Virtual)与组合
- C++对象内存分布(2) - 菱形继承(non virtual)
- C++对象内存分布(3) - 菱形继承(virtual)
- 【C++面向对象】类继承、多态与virtual成员
- C#继承中的关键字 virtual、override 与new
- virtual继承
- 继承中的二义性 虚继承 virtual关键字
- java继承与c++继承(Virtual)
- VS2005之virtual继承对象模型
- C#中的abstract与virtual
- C#中的abstract与virtual
- C#中的abstract与virtual
- C#中的abstract与virtual
- 关于c++中的virtual继承的总结
- c++学习日记 加virtual和不加virtual的区别
- 在基类的析构函数中加virtual ,解决内存泄漏
- linux学习
- 4. 初识 redis
- 图
- HADOOP框架的理解
- 递推递归练习 C
- 探究继承+virtual与不加virtual在对象内存中的分配
- Loadrunner 测试网页下载文件的脚本实例
- 我排第几个和排列序数
- C语言的行指针
- 游金麻将胡牌与算番
- 深度学习-读取图像特征库LevelDB中的数据
- 抓包 httpwatch 请求服务器和响应
- 在Matlab中实现透视变换的方法
- 使用Loadrunner进行文件的上传和下载