• C++继承(二)多继承,菱形继承,继承中同名成员问题的解决,虚继承。虚基类表和虚基类表指针。


    目录:

    一:多继承

    1.1:多继承的简单格式

    二:菱形继承

    2.1:问题及解决方法

    三:虚继承

    3.1:虚继承的语法格式

    3.2:虚基类表和虚基类表指针引出

    3.3:虚基类表和虚基类表指针详解

    一:多继承

    1.1:多继承的简单格式

    class son :public base1, public base2

    class(子类名称):(继承方式)(父类名称),(逗号拼接)(继承方式)(父类名称)

    后面可以一直使用逗号拼接符拼接下去,

     

    二:菱形继承

    我们直接通过一张图来了解一下

    例如有一个人类,父亲类从人类那里继承了一个代表年纪的属性,母亲类也从人类那里继承了一个代表年纪的属性,那么在孩子类中,就会出现两个这样代表同样属性的成员变量, 

    2.1:问题及解决方法

    如果我们直接初始化这样的孩子类对象,会出现什么问题呢???

    可以看到,我们直接使用m_Age会提示不明确,因为它不知道你使用的是父亲类继承下来的

     m_Age还是母亲类继承下来的m_Age。

    其实要解决也非常简单,只要加上作用域运算符就可以,加上作用域运算符确定要使用的数据到底是哪个类继承下来的 

     在这里呢就是指定使用从base1类中继承下来的m_Age。

     但是这种解决方式非常的不简洁,这里只有一个从相同的人类上继承的属性m_Age,那么如果有很多这样的属性,就不太好操作了。

    三:虚继承

    作用:虚继承就是为了解决可能遇到的菱形继承时,同名属性作用域不明确的问题。

    3.1:虚继承的语法格式

    进行虚继承后,base1与base2就称为虚基类,那么此时子类继承这两个父类时,编译器会自动将那些从同一个person类继承下来的属性,只继承一份。

    那么此时我们再去对s1中的m_Age进行操作,我们直接s1.m_Age也不会报错,而且使用作用域运算符输出base1和base2中继承的m_Age地址都是相同的。说明两个虚基类中的m_Age确实只继承了一份。 

    下面我们来深入的了解一下,这到底是怎么实现的。

    3.2:虚基类表和虚基类表指针引出

    我们通过base1所占空间大小 来看,base1继承于person类,而person类中,只有一个int类型的数据,那么根据结构体的内存对齐方式,这里的结果应该是四个字节,而不是8个字节。所以说在base1中,除了person类中的int类型数据,还有一个其他类型的变量,这个变量就是虚基类表指针。指向一张虚基类表

    3.3:虚基类表和虚基类表指针详解

    所以说,base1和base2在虚继承与person类时,在这两个子类中都生成了一个虚基类指针,指向两张不同的虚基类表

     那么son类在多继承于base1类和base2类时,也会继承这两个类中的虚基类指针,但是它只会生成一张虚基类表,那么在对成员m_Age进行操作时,因为两个指针在使用时自定的偏移量不同,导致最终指向同一个位置。

  • 相关阅读:
    RabbitMQ Windows 安装、配置、使用 - 小白教程
    卫龙更新招股书:年营收48亿 创始人刘卫平家族色彩浓厚
    带你深入了解git
    mysql实际调优
    wpf DataGridComboBoxColumn 如何显示一个多列的下拉框?_成就一亿技术人!
    数据结构-冒泡排序Java实现
    正则表达式中扩展表示法的理解
    openssl尽量不要动啊,成功恢复记录
    2022-45~46周(10.24-11.06) 项目问题整理
    React学习笔记三
  • 原文地址:https://blog.csdn.net/qq_51004011/article/details/125600180