4.4——多重继承

这篇具有很好参考价值的文章主要介绍了4.4——多重继承。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在前面学习了一个派生类只有一个基类,这种派生方法称为单继承或单基派生。当一个派生类具有两个或多个基类时,这种派生方法称为多重继承或多基派生。

多重继承派生类的声明

在C++中,声明具有两个以上基类的派生类与声明单基派生类的形式相似,只需要将继承的多个基类用逗号分隔即可,声明的一般形式如下:

class 派生类名:继承方式1 基类名1,……继承方式n 基类名n

{

        派生类新增的数据成员和成员函数

}

默认的继承方式是private,当出现缺省时,继承方式为private

说明:对基类成员的访问必须是无二义的

4.4——多重继承

当出现二义性,我们怎么解决。

4.4——多重继承

多重继承派生类的构造函数与析构函数

多重继承下派生类构造函数的定义形式与单继承派生类构造函数的定义形式相似,只是n个基类的构造函数之间用逗号分隔。多重继承下派生类构造函数的定义的一般形式如下:

派生类名(参数总表):基类名1(参数表1),基类名2(参数表2)……基类名n(参数表n)

{

        派生类新增数据成员初始化语句;

}

多重继承的构造函数的执行顺序和单继承构造函数一样,先执行基类的构造函数,再执行对象成员的构造函数,最后执行派生类的构造函数。

处于同一层次的各个基类构造函数的执行顺序,取决于声明派生类时所指定的各个基类的顺序,与派生类构造函数中定义的成员初始化列表的各项顺序没有关系。

析构函数的执行顺序则刚好与构造函数的执行顺序相反。

由于基类与派生类的析构函数是相互独立的,所以不会因为派生类没有析构函数则基类的析构函数得不到使用。

4.4——多重继承

4.4——多重继承

虚基类

如果一个类有多个直接基类,而这些直接基类又有一个共同的基类,则在最底层的派生类中会保留这个间接的共同基类数据成员的多份同名成员。在访问这些同名的成员时,必须在派生类对象名增加直接基类名,使其唯一地标识一个成员,以免产生二义性。

4.4——多重继承

4.4——多重继承 

为了防止图中所示的二义性出现,C++引入虚基数的概念。

虚基类的概念

上图中出现二义性的原因是,derived含有两个a,两个a都是base基类继承而来的,如果使derived只存在一个base继承而来的a,那么我们在derived类使用a时就不会产生二义性。在C++中,如果想使这个公共的基类只产生一个复制,则将这个基类说明为虚基类。虚基类在派生类的声明语法:

class 派生类名:virtual 继承方式 基类名

{

        ……

经过这样的声明后,当基类通过多条派生路径被一个派生类继承时,该派生类只继承该基类一次,也就是说,基类成员只保留一次。

4.4——多重继承

4.4——多重继承 

上述程序中,从类base派生出base1,base2,使用关键字virtual,把类base声明为base1,base2的虚基类。这样,从base1,base2派生出的derived只继承一次base,也就是说基类base的成员在derived中只保留一次。

程序的运行结果分析:

我们先调用基类的构造函数,所以第一句没有疑问。

我们看派生类derived,先继承base1,所以输出第二句;

derived先继承base1,再继承base2,因为base1和base2都是base的虚基类,内容只保留一次,内容保留在了base1(先继承),所以我们a的值变成了20,我们调用base2的构造函数,初始值a=20,所以base构造函数输出的a为40.

我们数据成员保留的是最后继承的数据成员的值。

虚基类的初始化

虚基类的初始化与一般的多继承的初始化语法上是一样的,但构造函数的调用顺序不同。在使用虚基类机制时应该注意以下几点:

1)如果在虚基类中定义有带参数的构造函数,并且没有定义默认形式的构造函数,则整个继承结构中,所有直接或间接的派生类都必须在构造函数的初始化成员列表对虚基类构造函数的调用,以初始化在虚基类中定义的数据成员。

2)建立一个对象时,如果这个对象中含有从虚基类继承来的成员,则虚基类成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的。该派生类的其他对虚基类的构造函数的调用都自动被忽略。

3)若同一层次同时包含虚基类和非虚基类,应先调用虚基类的构造函数,再调用非虚基类的构造函数,最后调用派生类的构造函数。

4)对于多个虚基类,构造函数的执行顺序仍然是先左后右,自上而下。

对于非基类,构造函数的执行顺序仍是先左后右,自上而下。

5)若虚基类由非虚基类派生而来,仍是先调用基类的构造函数,再调用派生类的构造函数。

6) 关键字virtual与派生方式的关键字的先后顺序无关紧要,它们是等价的

4.4——多重继承

7)一个基类在作为某些派生类的虚基类的同时,也可以作为另外派生类的非虚基类。 文章来源地址https://www.toymoban.com/news/detail-436792.html

到了这里,关于4.4——多重继承的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • C++中的继承和派生

    C++ 中的继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承类似,例如儿子继承父亲的财产。 继承(Inheri tan ce) 可以理解为一个类从另一个类获取成员变量和成员函数的过程。例如类 B 继承于类 A,那么 B 就拥有 A 的成员变量和成员函数。 在C++中,

    2024年02月10日
    浏览(32)
  • C# 什么是继承和派生

    在 C# 中,继承(Inheritance)是一种机制,它允许一个类(子类)从另一个类(父类)中继承属性和方法。这种关系使得子类可以重用父类的代码,同时可以在子类中添加或修改属性和方法。继承有助于减少代码重复和提高代码的可维护性。 派生(Derivation)是指使用继承机制

    2024年02月09日
    浏览(30)
  • 实验三 Java类的继承与派生

    Student IStudentDAO StudentDAOImpl MainClass

    2024年02月05日
    浏览(41)
  • C++ | 继承(基类,父类,超类),(派生类,子类)

    文章参考:https://blog.csdn.net/war1111886/article/details/8609957 一 .继承中的访问权限关系 1.基类,父类,超类是指被继承的类,派生类,子类是指继承于基类的类.  2.在C++中使用: 冒号表示继承,如class A : public B;表示派生类A从基类B继承而来 3.派生类包含基类的所有

    2024年02月15日
    浏览(30)
  • 第八站:C++面向对象(继承和派生)

     派生:由父类派生出子类 继承:子类继承父类(继承不会继承 析构函数和构造函数 : 父类的所有成员函数,以及数据成员,都会被子类继承! ) \\\"子类派生出的类\\\"会指向\\\"父类被继承的类\\\", 父类就是基类 实例1: 先创建一个父类,有私有成员数据(name,和age),成员函数,描述信息,有参的

    2024年01月19日
    浏览(36)
  • C++(20):多重继承与虚继承

    多重继承 是指从多个直接基类中产生派生类的能力。多重继承的派生类继承了所有父类的属性。 在派生类的派生列表中可以包含多个基类: 每个基类包含一个可选的访问说明符。如果说明符被忽略掉了,则 class 对应的默认访问说明符是 private , struct 对应的是

    2024年02月10日
    浏览(24)
  • cpp_10_多重继承_钻石继承_虚继承

            一个类可以同时从多个基类继承实现代码。         子类对象内部包含 多个 基类子对象。         按照 继承表 的顺序依次被构造,析构的顺序与构造 严格相反 。         各个基类子对象按照从 低 地址 到高 地址排列。         (1)将子类对象的指针, 隐式

    2024年01月25日
    浏览(50)
  • python对象的多重继承

    一个从多个父类继承过来的子类,可以访问所有父类的功能。并不推荐使用。 多重继承最简单有用的形式是mixin。假设在之前Contact类增加一个功能,允许给self.email发送一封邮件。 EmailableContact这个类不做任何特别的事(实际上,它仅仅是起到一个独立的类的作用),但是通过

    2024年02月16日
    浏览(25)
  • Solidity 多重继承 C3算法

      执行D.bar的结果 执行顺序 最右C.bar C里有 super.bar,执行的是b里的 bar B里的 super.bar 执行的是a里的bar 具体原因是: Solidity Diamond Inheritance - Guides and Tutorials - OpenZeppelin Forum solidity和python一样采用C3 继承算法 去掉代码里的 super.bar,结果就变成

    2024年02月12日
    浏览(31)
  • 头歌Educoder实验:C++ 面向对象 - 类的继承与派生

    第1关:公有继承 —— 学生信息类 任务描述 本关任务:采用公有继承设计学生信息类。 相关知识 继承 继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一。简单的说,继承是指一个对象直接使用另一对象的属性和方法。 C++ 中的继承关系就好比现实生

    2024年02月04日
    浏览(108)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包