虚继承的底层原理

菱形继承概念

两个派生类继承同一个基类又有某个类同时继承者两个派生类这种继承被称为菱形继承,或者钻石继承

菱形继承产生的问题

在这里插入图片描述

  1. 羊继承了动物的数据,驼同样继承了动物的数据,当草泥马使用数据时,就会产生二义性.
  2. 草泥马继承自动物的数据继承了两份,其实我们应该清楚,这份数据我们只需要一份就可以

要解决问题1,仅需对需要访问的指定成员属性/函数添加加作用域区分即可
问题2的菱形继承导致资源浪费,需要使用虚继承的方式。

下面探讨虚继承的底层原理

sheep类tuo类使用virtual虚继承方式继承之后,在SheepTuo类继承了sheep类tuo类之后,在程序的底层,每个类在virtual继承之后会产生一个vbptr,即:虚基类指针vbptrvbptr指向vbtable虚基类表。
vbtable记录的是数据的偏移量。在sheep类tuo类进行虚继承之后,自身的vbptr指向自身的vbtable,但是两个vbtable记录的偏移量在计算之后得到的最终地址,均指向同一份数据。

因此在使用虚继承解决菱形继承导致的资源浪费问题时,实际上继承之后,只有一份数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
编程的历史是一个缓慢而稳定的前进过程,从直接管理底层机器的操作,到用语言结构来表达高层抽象。结构化方法的发明一直驱动着编程语言和设计方法的发展,结构化方法提供了附加的模块化特性。子程序对非结构化的机器指令的行为进行了组合。结构化编程表现了这些子程序的语义涵义,抽象的数据结构体现了数据和行为的统一,面向对象的方法则将此概括为相关数据和行为的多样性。 目前的编程主流领域是面向对象(OO)技术。通过使用对象,程序员可以把世界当作一些专门类的实例,这些类提供了方法,这些方法以命令式程序表示,用来描述类的所有对象的行为。 面向对象有很多的优点,特别是与先前的技术相比。对象提供了模块化特性。给对象发送消息这一概念使程序员能集中精力思考代码,而且有助于理解代码。对象中的继承机制提供了一种方式,既可描述多个类的相关行为,还能处理所描述行为的异常。 对象并非编程组织中的惟一的一个概念。编程开发的一个新阶段--面向方面的软件开发。CaesarJ就是基于面向方面的软件开发方法。   20世纪70年代以来,编程语言的研究集中在编码层次模型的机制上,即在更详细或较不详细的角度上看待系统的机制。如果我们假设真实世界的系统可以被组织成思想独立的概念层次,则这样做很有效。但是,对系统的不同观点可能会产生彼此非层次相关的模型。由于在传统语言中,不可能表示这样的横切模型,因此被迫将软件系统结构化成层次模型,通过随意选择一个横切模型作为主要的分解标准。这种主模型的随意选择导致了代码混乱和分散。   面向方面语言需要更好的支持横切模型,因此CaesarJ被提出。使用CaesarJ才有可能实现针对不同横切模型实现不同软件片断,再在以后通过特殊的称为联编的转换器将它们按需要组合在一起。CaesarJ的功能在于方面的重用和组件化,允许多态的使用方面。提出了多态的概念,作为子类多态的泛化来横切模型,还引入了虚类和族多态的概念。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

colorful_stars

您是我见过全宇宙最可爱的人!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值