C++菱形继承所带来的问题解决方法(虚继承)

        首先,阅读该内容需要有继承的基本概念,以方便后续内容的理解。

一、菱形继承的原理

        菱形继承的原理基于单继承和多继承当多个继承了同一个父类的子类再被一个子类继承时,便可称为菱形继承。如下图:

        从图可以看到菱形继承的大致原理,虽然叫菱形继承,但并非继承关系只呈现菱形,菱形只是这种继承的一种,千万不要被名字误导,不要被名字误导,不要被名字误导!重要的事情说三遍。 

二、菱形继承的危害

        了解了菱形继承的原理,和基本模式之后,你是否有了许多的奇思妙想?比如什么五边形继承,梭状继承,树状继承等等。那么当你把这些菱形继承的派生实现后,是不是会发现一些问题。

        1.二义性

        当源类中有一个变量时,如果你直接使用,编译器并不知道使用的是哪一个类的变量,只有显式指定访问才能解决。

        2.数据冗余 

        上图中,虽然指定访问可以使得一些重复数据可以分开使用,模拟了如外号这种多name的场景,可是当源类中存在绝对的单一变量,如身份证号时,菱形继承的数据冗余性便暴露无疑,因为一个人不可能有多个身份证号!

三、菱形继承问题的解决

        那么为了解决二义性和数据冗余的问题,C++3.0加入了虚继承的概念,即在继承的时加上virtual关键字,便可以形成虚继承,如下:

        形成虚继承后,再次看向内存,便如下图:

        可以看到,B1,B2这两个派生类中,因为使用虚继承,出现了两个指针(黑色边框),这里不买关子,这个指针被称为虚基表指针,那么顾名思义,被虚基表指针指向的那块区域当然就叫虚基表

        虚基表中储存的便是派生类对基类变量的偏移量,细心的同学一定发现了,虚基表指针的地址加上虚基表中的偏移量,便是基类A的地址。

        *如B1的虚基表指针地址0x00AFFC00+14=0x00AFFC14,即基类A的地址。

        如此,数据的二义性与冗余被解决,无论是使用B1或者B2的A类变量,都是同一个变量!但是但是,有聪明的小伙伴可能会说,这不就是把多的冗余变量变成了一个变量,哪里需要整的这么花里胡哨的,直接将多余的变量不再分配内存就好了嘛?的确,这样很简洁暴力,可是暴露了很多问题。

        1.切片时无法找到属于基类的数据。

        2.分开赋值(泛型编程时)无法成功,因为不知道这个唯一基类变量属于哪一个派生类,又形成了一种二义性。

        对比之下,虚基表的优势便显现了出来,无论是切片时还是赋值,派生类都可以通过偏移量找到基类的变量,就跟你爸和你妈都可以通过导航走不同路线,回到家一样。所以不得不说虚基表的设计很巧妙,👍。

实用沟通技能与技巧培训PPT下载,作者:布衣公子; 实用沟通技能与技巧培训PPT目录 沟通知识概述 为啥沟通不畅 沟通能力提升 职场沟通理念 一、沟通知识概述: 沟通的定义及作用 沟通的重要性 沟通的类别 沟通的原理图 沟通是人与人之间传递信息、传播思想、传达情感的过程,是一个人获得他人思想、情感、见解、价值观的一种途径,是人与人之间交往的一座桥梁,通过这个桥梁,人们可以分享彼此的情感和知识,消除误会,增进了解,达成共同认识或共同协议。 ... ... ... 二、为啥沟通不畅 从沟通渠道的角度来分析 从编码的角度来分析 从解码的角度来分析 沟通就是为了“了解自已,了解别人”、“发现他人的需要,展现自已的需要”。因此,一旦沟通缺失,就容易产生隔膜,长此以往,将造成不可挽回的不良后果。而沟通的缺失,往往是沟通双方不够主动所造成的。 比如说,应当用正式沟通的事情,却采用了非正式沟通的方式进行;或者,是应当采用非正式沟通的事情却错误地以正式沟通形式进行,请您尝试举个例子吧:) 良好沟通的先决条件是和谐的气氛。这种氛围,与人的心理感受息息相关。人际沟通最忌讳的,就是一脸死相。如果沟通者的态度傲慢无礼、粗暴易怒、虚情假意等,就容易形成防御性的沟通氛围。在防御性的氛围下,人们变得谨慎和退缩,有两种表现,一种是沉默以自保;一种是反攻,致力于证明自己正确,且有时会变得偏激,这都会影响沟通的效果。 ... ... ... 三、沟通能力提升 从沟通渠道的角度来提升 从编码的角度来提升 从解码的角度来提升 主动开启沟通渠道:似乎,很少有员工会主动找上级沟通,对上级有天然的畏惧心理,怕打扰上司,怕自己的心思被领导洞悉,怕暴露自己的缺点等等,但如果我们不主动、不及时地跟上级沟通,就无法及时和上级达成工作进度的一致或获得领导的指导,无法准确领会上级的建议或意见,带着猜想做事,最终导致做无用功,自己的努力白费。 如果下属不够主动,领导就要主动些,要通过主动沟通,来关心下属,关注工作。不要说,我只要结果,如果不注重过程,何来好的结果?更不能等到下属递出离职申请了,才顿感措手不及,平时哪儿去了?为什么平时不主动跟下属沟通呢? 选择合适的沟通渠道:沟通渠道是指信息传播者传递信息的途径,渠道的选择直接关系到传播效果,因此,选择合适的沟通渠道是必要的。 ... ... ... 四、职场沟通理念 向上沟通要有“胆” 平行沟通要有“肺” 向下沟通要有“心” 上下级间的沟通并不是一件轻易的事。很少有员工会主动找上级沟通,即使有,也很少有人会讲真话、心里话。因为我们历来受的教育都是告诉我们要谦虚谨慎,要回避矛盾,回避冲突,不强出头,长期以来,我们已经习惯于“即不反对,也不赞成”;“即不讨好,也不得罪”。 由于受到这种等级观念、潜在自我保护意识、及中国传统文化和环境的影响,结果是上下极之间的误会、隔阂和不理解越来越深。 要克服惧怕领导的心理:与领导沟通时,下属首先要做的就是去掉一个“怕”字,即克服惧怕领导的心理,主动大胆地寻求与领导的认真交流,征求领导的意见。 即使领导批评了自己,也不要认为天就塌下来了,要积极地向领导寻求帮助,寻求办法,能得到领导的帮助和指点,无疑对克服自己在工作上的缺点和不足有重要意义。这样有胆量的沟通能及时消除领导对自己的误解,了解领导的真实意图,能更好地指导自己下一步的工作。 要多出选择题,少出问答题:一个善于思考、做事负责的手下,是不会一天到晚请示领导的。所以我们应该带着答案、预备好对策走进领导的办公室。也就是说,你和领导沟通的时候,应当尽可能多出选择题,而不出问答题,并且是尽可能出多选题,而非单选题。 因为假如你只带了一个答案,就表示除了这个没有更好的办法。另外还要注重,在给选择题的时候,应当罗列每种方案或办法的优缺点以及可能的后果,以提醒你的领导在决策时应该考虑到的因素。 要主动地、及时地反馈:任何已经安排下来的事项,当领导主动去提醒或追问的时候,是下属工作失败的表现。作为一个职业人,一件事交给你去做,你如何做的,进展到什么程度,有没有做好,收到了什么实效?这些问题永远都不要等到领导问你时才回答。 假如你能够不要让你的领导象秘书一样不断地提醒你,假如你能够让他省心、放心。那他对你的认可和授权就会越来越大,几次下来以后,事情交待给你,他也就不会再过问了。 平行沟通,又称横向沟通,指的是与平级间进行的与完成工作有关的交流。 由于社会化分工越来越细,往往为完成一个目标、一项工程、一个产品,需要在不同企业之间、部门之间、同事之间,在营销、生产、管理等不同环节、不同阶段,共同利用同一资源为产生整体的效益而协同工作。为此,平级之间的沟通与合作是非常必要的。 同事与我们处于同一企业、同一部门、同一车间、同一班组或同一办公场所,为了生存和发展要感受同一种压力,工作中你中有我,我中有你,谁也少不了谁。每天与同事在一起的时间有时会大大超过自己的家人。 同事短暂,朋友长存。同事作为你工作中的伙伴,难免有利益上或其他方面的冲突,处理这些矛盾的时候,最好第一个想到的解决方法是以肺腑之言真诚沟通,共同协商解决问题的办法,而不是指责或者命令。 【余世维观点】作为管理者,对于企业各个部门要经常说“我们”,不要说“你们、他们”。谈到自己公司时,只有一个代名词:“我们”,“你们、他们”会造成疏离感,破坏团结。 ... ... ... 关键词:职场沟通技能,沟通技巧培训PPT下载,优秀PPT作品欣赏,.PPTX格式;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值