当前位置:网站首页>虚继承的原理
虚继承的原理
2022-07-31 23:34:00 【华为云】
虚继承的原理
C++编译器是如何通过虚继承解决数据冗余和二义性的呢?
1.通过监视窗口已经看不到真实的存在,因为监视窗口被编译器处理过
2.建议使用内存窗口来进行查看
虽然虚继承补了菱形继承的坑,但是也付出了很大的代价, 1.对象模型更复杂了,学习理解成本很高 2.有一定的效率影响
虚拟继承解决数据冗余和二义性的原理 为了研究虚拟继承原理,我们给出了一个简化的菱形继承继承体系,再借助内存窗口观察对象成员的模型。

未使用虚继承:
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 我们也可也看出, 先继承的在前面,后继承的在后面,
这里就可以看出为什么菱形继承导致了数据冗余和二义性,根本原因就是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
注意:虚基表中存的是相对地址

下图是菱形虚拟继承的内存对象成员模型:这里可以分析出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类对象的最后
只要有公共的祖先类就是菱形继承
例如:

边栏推荐
- Unity - by casting and cloning method dynamic control under various UGUI create and display
- 浏览器下载快捷方式到桌面(PWA)
- Shell常用脚本:Nexus批量上传本地仓库脚本
- The uniapp applet checks and prompts for updates
- vim的基本使用-底行模式
- What is customer profile management?
- Input and output optimization
- PHP三元(三目)运算符
- 基于simulink的Active anti-islanding-AFD主动反孤岛模型仿真
- 【Acwing】第62场周赛 题解
猜你喜欢

【云驻共创】【HCSD大咖直播】亲授大厂面试秘诀

UOS统信系统 - WindTerm使用

Shell common script: Nexus batch upload local warehouse script

浏览器下载快捷方式到桌面(PWA)

Program processes and threads (concurrency and parallelism of threads) and basic creation and use of threads

How to reduce the gap between software design and implementation

嵌入式开发没有激情了,正常吗?

2022-07-31:给出一个有n个点,m条有向边的图, 你可以施展魔法,把有向边,变成无向边, 比如A到B的有向边,权重为7。施展魔法之后,A和B通过该边到达彼此的代价都是7。 求,允许施展一次魔法

【MATLAB项目实战】LDPC-BP信道编码

Interview assault 69: TCP reliable?Why is that?
随机推荐
博弈论(Depu)与孙子兵法(42/100)
To help the construction of digital government, the three parties of China Science and Technology build a domain name security system
EntityFramework保存到SQLServer 小数精度丢失
/etc/sysconfig/network-scripts 配置网卡
IJCAI2022 | 代数和逻辑约束的混合概率推理
@JsonFormat(pattern="yyyy-MM-dd") time difference problem
SQL injection Less47 (error injection) and Less49 (time blind injection)
浏览器下载快捷方式到桌面(PWA)
#yyds dry goods inventory# Interview must brush TOP101: the entry node of the ring in the linked list
"SDOI2016" Journey Problem Solution
无状态与有状态的区别
周总结
Design of Fire and Anti-theft System Based on Single Chip GSM
Google Earth Engine——Error: Image.clipToBoundsAndScale, argument ‘input‘: Invalid type的错误解决
面试题:实现死锁
Handwritten a simple web server (B/S architecture)
内核对设备树的处理
22年8月推广大使额外奖励规则
什么时候可以使用 PushGateway
Network security - crack WiFi through handshake packets (detailed tutorial)