当前位置:首页 » 《休闲阅读》 » 正文

C++语法——详解虚继承

10 人参与  2024年04月05日 18:50  分类 : 《休闲阅读》  评论

点击全文阅读


目录

一.什么是虚继承

二.虚继承原理

三.虚继承使用注意事项


一.什么是虚继承

所谓虚继承(virtual)就是子类中只有一份间接父类的数据。该技术用于解决多继承中的父类为非虚基类时出现的数据冗余问题,即菱形继承问题。

小编用一张图来表述一下:

如果是下图这种非虚继承,那么D类中就会出现两个 int a,当我们用D实例化对象调用a时,编译会报错,因为发生了混淆。除非指定类域B或C。当然指定A也可以,因为默认会从第一个父类中找。

 此时,D的实例化对象内部结构如下:

而当我们使用虚继承时,结构是下图这样,D中只有一份父类A,当我们调用A中数据时,并不会发生冗余。

 此时,D对象内部结构是这样:

二.虚继承原理

在上图中,父类数据并不存放在虚继承的子类中,那么子类怎么找到父类数据呢?

——在虚继承的类中,会定义一个虚基表指针vbptr指向虚基表

而虚基表中会存在偏移量,这个量就是表的地址到父类数据地址的距离

我们可以通过调试,找到虚基表指针和虚基表:

首先,我们为每一个数据赋值,以便观察:

 之后,调用监视,查看d对象地址和d中a数据地址:

 再通过d的地址查看内存窗口,看d中内存分布:

由此我们可以分析得到对象d及其内部父类的内存布局:

在这个我们可能会有个疑问,那这B和C中两个是什么呢?

 这就是虚基表指针

再通过内存窗口,查看一下虚基表指针指向的地址,根据我们的了解应该就是虚基表,而其中存有偏移量

 而偏移量,就是虚基表指针地址到父类数据地址的距离,这里以b中虚基表为例

到这里我们就能解释一个问题:为什么bptr和cptr能够找到并不位于自己内部的变量a?

因为bptr和cptr都对d进行了切片,当各自寻找变量a时,会从自身的虚基表指针中找到虚基表,通过虚基表的偏移量找到变量a的地址,从而找到了变量a。 

画图解释就是这样:

 

三.虚继承使用注意事项

当使用虚继承的时候,需要注意,虚继承只有在多继承时才有用。也就是说如果只有一层继承关系或者是单继承都将不起作用。

因为虚继承是保证子类中只有一个间接父类,说简单一点就是虚继承只能在隔代继承中起作用。

比如下面两种情况即便虚继承也没有意义:

(1)是因为虽然虚继承产生了虚基表和指针,但是class B并没有子类,而虚继承是用以保证子类只有一个间接父类class A。当然话说回来,就算有子类、哪怕多个子类,也都体现不出虚继承,因为虚继承要求同一个子类的多个父类继承自同一个间接父类,而该例只有一个父类class B

(2)是因为虽然class C虚继承了class B,但是class B是class A的非虚继承,那么B中就会有一份A。而class D对A是虚继承,就导致E在实例化时会存放一个对D而言公共的A。这样E中还是存放了两个A。调用变量时还是会混淆。

这样说可能还有些难懂,那换个说法,class B中没有虚基表指针,而D中有虚基表指针,当E从D调用int a时会从虚基表指针找到公共区域的A,而E从B中找只会在B的区域内找到int a。

画图表示E内部结构就是这样:

 正确的继承关系应该是当class A的子类继承时,都是虚继承,这才能保证当有像class E这样的间接子类定义时,class在其中都只会在公共区域有一份。对本例来说即class B是虚继承。

 

 

只有两种编程语言:一种是天天挨骂的,另一种是没人用的——Bjarne Stroustrup(C++之父)


如有错误,敬请斧正

 


点击全文阅读


本文链接:http://zhangshiyu.com/post/90911.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 怀胎五月,老公一家逼我给小姑子捐骨髓精彩分享_婆婆苏伟小姑子隐藏剧情_小说后续在线阅读_无删减免费完结_
  • 风柏煜叶桐附加完整在线阅读(谋妻入瓮)最近更新列表
  • (谋妻入瓮)谋妻入瓮(风柏煜叶桐)无套路无弹窗全部章节列表
  • 盲眼大师他总勾搭我最新章节(萧廿颜宁北)全文免费阅读无弹窗大结局_萧廿颜宁北免费阅读
  • ⽗亲被欺辱后,我为他洗冤翻盘全文阅读_奶奶孙子麦芽糖独家首发_小说后续在线阅读_无删减免费完结_
  • 俞晓小说完结篇(豪门骗嫁:腹黑总裁步步谋婚)章节前文+全篇阅读(俞晓)最近更新
  • 手撕冒充我身份抢拉布布的第三者故事会_老公赵桐州陆雅宁免费阅读_小说后续在线阅读_无删减免费完结_
  • 以前不喜欢的人,以后也不会喜欢全文免费阅读无弹窗大结局_林雨浔楚淮晏最新章节列表_笔趣阁(以前不喜欢的人,以后也不会喜欢:完结+结局+番外)
  • 救命血被抽干,中了绝情蛊的老公弟弟双双傻眼了免费赏析_弟弟月儿谢总全文+后续_小说后续在线阅读_无删减免费完结_
  • 愿意季清涟小说番外+结局(心上音)小说在线阅读
  • 莫斯科没有眼泪好评_林陌瑾修许青青后续+完结_小说后续在线阅读_无删减免费完结_
  • 宠妻上瘾:霸道老公坏死了(秦慕辰苏莫浅)整本+后续+(宠妻上瘾:霸道老公坏死了)结局在线阅读

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1