当前位置:网站首页>The principle of virtual inheritance
The principle of virtual inheritance
2022-08-01 00:14:00 【HUAWEI CLOUD】
虚继承的原理
C++How does the compiler solve data redundancy and ambiguity through virtual inheritance??
1.通过监视窗口已经看不到真实的存在,因为监视窗口被编译器处理过
2.建议使用内存窗口来进行查看
Although virtual inheritance for the diamond inheritance,但是也付出了很大的代价, 1.对象模型更复杂了,学习理解成本很高 2.have a certain efficiency impact
虚拟继承解决数据冗余和二义性的原理 为了研究虚拟继承原理,我们给出了一个简化的菱形继承继承体系,再借助内存窗口观察对象成员的模型.

未使用虚继承:
class A{public: int _a;};class B : public A{public: int _b;};class C : public A{public: int _c;};class D : public B, public C{public: int _d;};int main(){ D d; d.B::_a = 1; d.C::_a = 2; d._b = 3; d._c = 4; d._d = 5; return 0;}未使用虚继承
下图是菱形继承的内存对象成员模型:这里可以看到数据冗余


先继承B,再继承C We can also see, 先继承的在前面,后继承的在后面,
这里就可以看出为什么菱形继承导致了数据冗余和二义性,根本原因就是D类对象当中含有两个_a成员.
使用虚拟继承后

class A{public: int _a;};class B : virtual public A{public: int _b;};class C : virtual public A{public: int _c;};class D : public B, public C{public: int _d;};int main(){ D d; d.B::_a = 1; d.C::_a = 2; d._b = 3; d._c = 4; d._d = 5; return 0;}
其中D类对象当中的_a成员被放到了最后,而在原来存放两个_a成员的位置变成了两个指针,这两个指针叫虚基表指针,它们分别指向一个虚基表. 虚基表中包含两个数据,第一个数据是为多态的虚表预留的存偏移量的位置(这里我们不必关心),第二个数据就是当前类对象位置距离公共虚基类的偏移量. 也就是说,这两个指针经过一系列的计算,最终都可以找到成员_a
注意:The virtual base table stores relative addresses

下图是菱形虚拟继承的内存对象成员模型:这里可以分析出D对象中将A放到的了对象组成的最下面,这个A 同时属于B和C,那么B和C如何去找到公共的A呢?这里是通过了B和C的两个指针,指向的一张表.这两个指 针叫虚基表指针,这两个表叫虚基表.虚基表中存的偏移量.通过偏移量可以找到下面的A.

下面是上面的Person关系菱形虚拟继承的原理解释:

若是将D类对象赋值给B类对象,在这个切片过程中,就需要通过虚基表中的第二个数据找到公共虚基类A的成员,得到切片后该B类对象在内存中仍然保持这种分布情况
子给父 -> 切片
int main(){ D d; d.B::_a = 1; d.C::_a = 2; d._b = 3; d._c = 4; d._d = 5; B b = d;//切片行为 return 0;}
_a对象仍然存储在该B类对象的最后
Diamond inheritance as long as there are common ancestor classes
例如:

边栏推荐
- 继承和友元,静态成员的关系
- SQL注入 Less46(order by后的注入+rand()布尔盲注)
- 力扣2326、197
- pycaret source code analysis: download dataset\Lib\site-packages\pycaret\datasets.py
- Drawing process of hand-drawn map of scenic spots
- 硬件设备计算存储及数据交互杂谈
- 如何设计高可用高性能中间件 - 作业
- MLP神经网络,GRNN神经网络,SVM神经网络以及深度学习神经网络对比识别人体健康非健康数据
- Web API Introduction and Types
- 一文概述:VPN的基本模型及业务类型
猜你喜欢
Mysql environment installation under Linux (centos)

虹科分享|如何用移动目标防御技术防范未知因素

面试突击69:TCP 可靠吗?为什么?
![[微服务]分布式事务解决方案-Seata](/img/a8/fc6c24e4d42dfb635bad786cc02164.png)
[微服务]分布式事务解决方案-Seata

Daily--Kali opens SSH (detailed tutorial)

精心总结十三条建议,帮你创建更合适的MySQL索引

【Acwing】The 62nd Weekly Game Solution

zeno使用方法笔记

《ArchSummit:时代的呐喊,技术人听得到》

(26) About menu of the top menu of Blender source code analysis
随机推荐
Kyoto University: Masaki Waga | Dynamic Masking for Reinforcement Learning in Black Box Environments
SQL注入 Less42(POST型堆叠注入)
消息队列存储消息数据的MySQL表格
高等代数_证明_任何矩阵都相似于一个上三角矩阵
Matlab/Arcgis processing nc data
[MATLAB project combat] LDPC-BP channel coding
Recommendation system: Summary of common evaluation indicators [accuracy rate, precision rate, recall rate, hit rate, (normalized depreciation cumulative gain) NDCG, mean reciprocal ranking (MRR), ROC
Redis五种数据类型简介
Drawing process of hand-drawn map of scenic spots
一文带你了解 Grafana 最新开源项目 Mimir 的前世今生
助力数字政府建设,中科三方构建域名安全保障体系
【MATLAB项目实战】LDPC-BP信道编码
lua入门案例实战1234定义函数与标准函数库功能
How to Design High Availability and High Performance Middleware - Homework
日常--Kali开启SSH(详细教程)
Likou Binary Tree
NIO programming
/etc/sysconfig/network-scripts configure the network card
SQL injection Less46 (injection after order by + rand() Boolean blind injection)
基于simulink的Active anti-islanding-AFD主动反孤岛模型仿真