【C++学习手札】一文带你认识C++虚继承​​

这篇具有很好参考价值的文章主要介绍了【C++学习手札】一文带你认识C++虚继承​​。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C++学习手札】一文带你认识C++虚继承​​,C++修仙 筑基中,c++,开发语言

                                        食用指南:本文在有C++基础的情况下食用更佳  

                                       🍀本文前置知识:C++虚函数(很重要,内部剖析)

                                       ♈️今日夜电波僕らのつづき—柊優花

                                                                1:06 ━━━━━━️💟──────── 3:51
                                                                    🔄   ◀️   ⏸   ▶️    ☰ 

                                      💗关注👍点赞🙌收藏您的每一次鼓励都是对我莫大的支持😍 


目录

🌸一、虚继承的引入—菱形继承

什么是菱形继承?

         🌰

        内层结构 

 💮二、什么是虚继承?

        语法定义

        🌰

        内层结构

🌺三、使用虚继承的原因

🌼四、使用虚继承需注意


🌸一、虚继承的引入—菱形继承

        什么是菱形继承?

        菱形继承是指在继承关系中存在一个派生类同时继承自两个或多个基类,而这些基类又共同继承自同一个基类。这样就会导致派生类中存在多个相同的基类子对象,从而造成资源浪费和二义性问题。

         🌰

class Animal
	 {
 public:
	 int data;
	 };

class Sheep :public Animal
	 {
 public:
	 };
 class Tuo :public Animal
 {
 public:
	 };

 class SheepTuo :public Sheep, public Tuo
 {
 public:
	 };
 int main(int argc, char* argv[])
 {
	 SheepTuo st;
	 //SheepTuo 从Sheep中继承data 从Tuo继承data 就产生二义性
	 //st.data = 200;//err
	 //第一种方式:加作用域解决
	 st.Sheep::data = 200;
	 st.Tuo::data = 300;
	
	 return 0;
 }

        内层结构 

        这段代码的内层结构如下:        

【C++学习手札】一文带你认识C++虚继承​​,C++修仙 筑基中,c++,开发语言

        这就是典型的菱形继承的例子,SheepTuo 从Sheep中继承data 从Tuo继承data 就产生二义性。但是我们可以采用加作用域的方式解决问题。

        那有没有更加优的解决办法呢?答案是虚继承! 


 💮二、什么是虚继承?

       本文为虚函数后的知识, 强烈建议各位先去了解一下此文:

                         🍀本文前置知识:C++虚函数(很重要,内部剖析)

        在多继承中,如果一个派生类从两个或多个基类继承,而这些基类又共同继承自同一个基类,那么就会出现菱形继承问题。这种情况下,派生类将会有两份相同的基类成员,导致二义性和冗余。

        虚继承通过在派生类对共同基类的继承前加上关键字"virtual"来解决这个问题。使用虚继承后,共同基类的成员只会在派生类中存在一份,从而避免了二义性和冗余。

        通过使用虚继承,可以确保多继承中的共同基类只会在派生类中存在一份,从而解决菱形继承问题。

        语法定义

class Base {
  
};

class Derived : virtual public Base {

};

        🌰

class Animal
	 {
 public:
	 int data;
	 };

class Sheep :virtual public Animal
	 {
 public:
	 };
 class Tuo :virtual public Animal
 {
 public:
	 };

 class SheepTuo :public Sheep, public Tuo
 {
 public:
	 };
 int main(int argc, char* argv[])
 {
	 SheepTuo st;
	 //在加入virtual后二义性以及冗余得以解决
	 st.data = 200;
	
	 return 0;
 }

        内层结构

        这段代码的内层结构如下: 

          Animal:(未变,因为改变的不是他)

【C++学习手札】一文带你认识C++虚继承​​,C++修仙 筑基中,c++,开发语言

         Sheep:(产生了虚基指针和虚基表)

【C++学习手札】一文带你认识C++虚继承​​,C++修仙 筑基中,c++,开发语言

         Tuo:(同样也产生了虚基指针和虚基表)

【C++学习手札】一文带你认识C++虚继承​​,C++修仙 筑基中,c++,开发语言

         SheepTuo:(保存了两个父类的虚基指针)

【C++学习手札】一文带你认识C++虚继承​​,C++修仙 筑基中,c++,开发语言

【C++学习手札】一文带你认识C++虚继承​​,C++修仙 筑基中,c++,开发语言


🌺三、使用虚继承的原因

        敏锐的你可能已经发现了,每当使用了virtual以使用虚继承后,相对于没有使用虚继承的子类,他们的的内存都加了4字节的vptr指针,而最后的最后的那个子类则是多出了两个4字节的vptr指针,很明显,通过内层结构图我们得知,这两个指针分别指向这个子类的两个父类的虚基表vftable。之所以 产生 vbptr和vbtable目的 是为了保证 不管多少个继承 虚基类的数据只有一份。

         一图让你明白~

【C++学习手札】一文带你认识C++虚继承​​,C++修仙 筑基中,c++,开发语言


🌼四、使用虚继承需注意

        虚继承只有在多继承时才有用。虚继承只能解决具备公共祖先的多继承所带来的二义性问题,不能解决没有公共祖先的多继承的。单继承以及只有一层的继承都是不行的。

        虚继承:不管继承多少次 虚基类 只有一份。


                感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o!  

                                【C++学习手札】一文带你认识C++虚继承​​,C++修仙 筑基中,c++,开发语言 

                                                                 给个三连再走嘛~      

 文章来源地址https://www.toymoban.com/news/detail-659544.html

到了这里,关于【C++学习手札】一文带你认识C++虚继承​​的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++学习手札】-引用与内联函数以及C++中对const拓展详解(超详细!)

                                           食用指南:本文在有C基础的情况下食用更佳                                        🔥 这就不得不推荐此专栏了:C语言                                        🍀 内联函数前置知识 :宏函数

    2024年02月14日
    浏览(49)
  • 【JAVA杂货铺】一文带你走进面向对象编程|继承|重载|重写|期末复习系列 | (中4)

    🌈个人主页:  Aileen_0v0 🔥系列专栏 :Java学习系列专栏 💫个人格言:\\\"没有罗马,那就自己创造罗马~\\\"   目录 继承  私有成员变量在继承中的使用​编辑  当子类和父类变量不重名时: 当子类和父类重名时:  📝总结: 继承的含义: toString方法的作用:  重写和重载的区别 对比狗和

    2024年02月05日
    浏览(52)
  • 一文带你通俗理解23种软件设计模式(推荐收藏,适合小白学习,附带C++例程完整源码)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处        设计模式是为了解决在软件开发过程中遇到的某些问题而形成的思想。同一场景有多种设计模式可以应用,不同的模式有各自的优缺点,开发者可以基于自身需求

    2024年02月09日
    浏览(52)
  • 【C++】一文带你吃透C++多态

    🍎 博客主页:🌙@披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 C/C++专栏 🌙那些看似波澜不惊的日复一日,一定会在某一天让你看见坚持的意义!-- 算法导论🌙 🍉一起加油,去追寻、去成为更好的自己! @TOC 提示:以下是本篇文章正文内容,

    2024年02月08日
    浏览(63)
  • 【C++】一文带你走入vector

    ヾ(๑╹◡╹)ノ\\\" 人总要为过去的懒惰而付出代价 ヾ(๑╹◡╹)ノ\\\" vector文档介绍 大部分的使用与string的使用类似 vector类似于顺序表,是动态增长的数组。头文件:#include vector vector是表示 可变大小数组 的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。也

    2024年02月08日
    浏览(53)
  • 【C++ • STL】一文带你走进string

    ヾ(๑╹◡╹)ノ\\\" 人总要为过去的懒惰而付出代价 ヾ(๑╹◡╹)ノ\\\" STL (standard template libaray- 标准模板库 ):是C++标准库的 重要组成部分 ,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。 STL六大组件 开源的:linux、git、STL、mysql、安卓……【开源会发

    2024年02月09日
    浏览(45)
  • 【C++】万字一文全解【继承】及其特性__[剖析底层化繁为简](20)

    前言 大家好吖,欢迎来到 YY 滴C++系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁 主要内容含: 欢迎订阅 YY 滴C++专栏!更多干货持续更新!以下是传送门! YY的《C++》专栏 YY的《C++11》专栏 YY的《Linux》专栏 YY的《数据结构》专栏 YY的《C语言基础》专栏 YY的《初学者易

    2024年02月01日
    浏览(74)
  • 【C++杂货铺】一文带你走进RBTree

    红黑树是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是 Red 或 Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,这句话换个意思就是:红黑树中最长路径不超过最短路径的 2 倍

    2024年02月08日
    浏览(50)
  • 【C++】一文带你吃透string的模拟实现 (万字详解)

    (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是 Scort 🎓 🌍博客主页:张小姐的猫~江湖背景 快上车🚘,握好方向盘跟我有一起打天下嘞! 送给自己的一句鸡汤🤔: 🔥真正的大师永远怀着一颗学徒的心 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏 🎉🎉欢迎持续关注! 🎨传统写

    2024年02月03日
    浏览(203)
  • 一文带你学习SQL注入

    SQL注入攻击属于注入攻击的一种,注入攻击的本质,是把用户输入的数据当做代码执行。这里有两个关键条件,第一个是用户能够控制输入;第二个是原本程序要执行的代码,拼接了用户输入的数据 下面是一个SQL注入的典型例子: 变量ShipCity的值由用户提交,在正常情况下,

    2024年02月09日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包