C++(20):多重继承与虚继承

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

多重继承 是指从多个直接基类中产生派生类的能力。多重继承的派生类继承了所有父类的属性。

多重继承

在派生类的派生列表中可以包含多个基类:

class Bear : public zooAnimal {
class Panda : public Bear, public Endangered{/* ...*/};

每个基类包含一个可选的访问说明符。如果说明符被忽略掉了,则关键字class对应的默认访问说明符是private,关键字struct对应的是public

多重继承的派生列表只能包含已经被定义过的类,而且这些类不能是final的。

多重继承的派生类从每个基类中继承状态

在多重继承关系中,派生类的对象包含有每个基类的子对象。
C++(20):多重继承与虚继承,编程语言,c++,开发语言

派生类构造函数初始化所有基类

构造一个派生类的对象将同时构造并初始化它的所有基类子对象。
与从一个基类进行的派生一样,多重继承的派生类的构造函数初始值也只能初始化它的直接基类。

//显式地初始化所有基类
Panda::Panda(std::string name, bool onExhibit)
	:Bear(nane,onExhibit,"Panda"), Endangered(Endangered::critical) {	}
//隐式地使用Bear的默认构造函数初始化Bear子对象
Panda::Panda()
	:Endangered (Endangered::critical){	}

派生类的构造函数初始值列表将实参分别传递给每个直接基类。
其中基类的构造顺序与派生列表中基类的出现顺序保持一致,而与派生类构造函数初始值列表中基类的顺序无关。

析构函数与多重继承

派生类的析构函数只负责清除派生类本身分配的资源,派生类的成员及基类都是自动销毁的。合成的析构函数体为空。
析构函数的调用顺序正好与构造函数相反。

多重继承的派生类的拷贝与移动操作

与只有一个基类的继承一样,多重继承的派生类如果定义了自己的拷贝/赋值构造函数和赋值运算符,则必须在完整的对象上执行拷贝、移动或赋值操作。
只有当派生类使用的是合成版本的据拷贝、移动或赋值成员时,才会自动对其基类部分执行这些操作。在合成的拷贝控制成员中,每个基类分别使用自己的对应成员隐式地完成构造、赋值或销毁等工作。

类型转换与多个基类

在只有一个基类的情况下,派生类的指针或引用能自动转换成一个可访问基类的指针或引用。
可以令某个可访问基类的指针或引用直接指向一个派生类对象。

基于指针类型或引用类型的查找

与只有一个基类的继承一样,对象、指针、引用的静态类型决定了能够使用哪些成员。
如果使用了基类 Base1 的指针,则只有定义在 Base1 中的操作是可以使用的。

ZooAnimal/Endangered中定义的虚函数

C++(20):多重继承与虚继承,编程语言,c++,开发语言

多重继承下的类作用域

在只有一个基类的情况下,派生类的作用域嵌套在直接基类和间接基类的作用域中。
查找过程沿着继承体系自底向上进行,直到找到所需的名字。派生类的名字将隐藏基类的同名成员。

当一个类拥有多个基类时,有可能出现派生类从两个或更多基类中继承了同名成员的情况。此时,不加前缀限定符直接使用该名字将引发二义性。

虚继承

尽管在派生列表中同一个基类只能出现一次,但实际上派生类可以多次继承同一个类。派生类可以通过它的两个直接基类分别继承同一个间接基类,也可以直接继承某个基类,然后通过另一个基类再一次间接继承该类。

在默认情况下,派生类中含有继承链上每个类对应的子部分。如果某个类在派生过程中出现了多次,则派生类中将包含该类的多个子对象。

虚派生只影响从指定了虚基类的派生类中进一步派生出的类,它不会影响派生类本身。

当包含多个基类的子对象时,访问基类的成员会出现二义性问题。

指定虚基类的方式是在派生列表中添加关键字virtual

//关键字public和virtual的顺序随意
class Raccoon : public virtual ZooAnimal{/* ...*/];
class Bear : virtual public ZooAnimal{/*...*/ };

virtual说明符表明了一种愿望,即在后续的派生类当中共享虚基类的同一份实例。

不论基类是不是虚基类,派生类对象都能被可访问基类的指针或引用操作。

虚基类(Virtual Base Class)的成员在派生类中的可见性遵循以下规则:

1. 虚基类的成员在最终派生类中是可见的:虚基类的成员在最终继承自虚基类的派生类中是可见的,可以直接访问。这是虚基类的主要目的之一,确保只有一个实例(子对象)存在,因此其成员不会重复出现。
2. 如果虚基类的成员在派生类中产生二义性,需要使用限定符解决:如果虚基类的成员在最终派生类中产生了名称冲突或二义性,可以使用限定符来指定要访问的虚基类的成员。

class Base {
public:
    int data;
};

class VirtualBase : public virtual Base {
};

class Derived1 : public VirtualBase {
};

class Derived2 : public VirtualBase {
};

class MostDerived : public Derived1, public Derived2 {
public:
    void AccessData() {
        // 通过限定符指定要访问的虚基类成员
        int value = VirtualBase::data;
    }
};

构造函数与虚继承

在虚派生中,虚基类是由最低层的派生类初始化的。

虚继承的对象的构造方式

含有虚基类的对象的构造顺序与一般的顺序稍有区别:首先使用提供给最低层派生类构造函数的初始值初始化该对象的虚基类子部分,接下来按照直接基类在派生列表中出现的次序依次对其进行初始化。

虚基类总是先于非虚基类构造,与它们在继承体系中的次序和位置无关。

一个类可以有多个虚基类。这些虚基类子对象按照它们在派生列表中出现的顺序依次构造。文章来源地址https://www.toymoban.com/news/detail-692590.html

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

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

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

相关文章

  • 【编程】C++语言编程规范-2

    结合C++ Effective系列参考树、尤其是工程经验教训的总结。 并发 除非必要,尽量少用线程。 多线程编程要守护好内存,使用atomic、mutex、condition variable、future、semaphore、latch、barrier等同步机制避免数据竞争。 尽量缩小临界区,临界区指独占的资源,禁止其他线程访问变量的代

    2024年02月21日
    浏览(52)
  • 2023-05-20青少年软件编程(C语言)等级考试试卷(一级)解析

    2023-05-20青少年软件编程(C语言)等级考试试卷(一级)解析 T1、输出第二个整数 输入三个整数,把第二个输入的整数输出。 时间限制:1000 内存限制:65536 输入 只有一行,共三个整数,整数之间由一个空格分隔。整数是32位有符号整数。 输出 只有一行,一个整数,即输入

    2024年02月09日
    浏览(52)
  • 使用C++编写自己的编程语言CASM

    CASM帮助文档: CASM解释器讲解视频: 我独自开发了一种编程语言:CASM CASM解释器源代码(剪贴板有问题,总是粘贴成一行,哪位大佬帮帮我……): #include iostream #include cstring #include string #include cstdio #include map #include queue #include stack #include cstdlib #include list #include \\\"hint.hpp\\\" us

    2024年02月10日
    浏览(52)
  • 编程语言比拼之Java VS C++

    学Java还是C++?   Java和C++都是非常受欢迎的编程语言,各有各的优势和适用场景。以下是对它们的简要比较: 性能:C++通常被认为是一种更高效的编程语言,适用于对性能要求较高的应用程序,如游戏开发、嵌入式系统和高频交易等。C++具有更接近底层的控制能力,允许开发

    2024年02月13日
    浏览(43)
  • C#编程语言的优势与C++对比

           C#语言是由 C/C++演变而来的,是微软推出的一种基于.NET框架的、面向对象的高级编程语言。以.NET框架类库作为基础,拥有类似Visual Basic的快速开发能力。简单易学,入门超快,减少了烦人的指针,有统一的操作符/修饰符/运算符,使用起来极其舒心。         对于

    2024年02月09日
    浏览(43)
  • 模拟计算器编程教程,中文编程开发语言工具编程实例

    模拟计算器编程教程,中文编程开发语言工具编程实例 中文编程系统化教程,不需英语基础。学习链接 ​​​​​​https://edu.csdn.net/course/detail/39036 课程安排:初级1 1  初级概述 2  熟悉构件取值赋值 3 折叠式菜单滑动面板编程 4 自定义图形窗口自定义标题栏编程 5 多行文本

    2024年02月08日
    浏览(66)
  • [编程语言][C++][Qt]单独添加UI文件

    不知什么原因,Qt Creator并不是很完美很智能。当先写好界面类的头文件和源代码文件后,我们再添加用于可视化界面设计的UI文件时,会出现一些问题。 当使用CMake管理项目时,CMake会读取 CMakeLists.txt 文件来确定各种项目设置。需要把 MainWindow.ui 包含进项目时,在 CMakeLists.

    2024年02月07日
    浏览(46)
  • C++ 编程入门指南:深入了解 C++ 语言及其应用领域

    C++ 是一种跨平台的编程语言,可用于创建高性能应用程序。 C++ 是由 Bjarne Stroustrup 开发的,作为 C 语言的扩展。 C++ 为程序员提供了对系统资源和内存的高级控制。 该语言在 2011 年、2014 年、2017 年和 2020 年进行了 4 次重大更新,分别为 C++11、C++14、C++17 和 C++20。 C++ 是世界上

    2024年03月21日
    浏览(51)
  • 中文编程开发语言工具构件说明:屏幕截取构件的编程操作

    屏幕截取 用于截取指定区域的图像。 图    标: 构件类型:不可视 重要属性 l        截取类型 枚举型,设置在截取屏幕时的截取类型。包括:全屏幕、指定区域、活动窗口三种。当全屏幕截取时相当于执行了硬拷屏(PrintScreenSysRq键)功能;指定区域截取则是通过矩形

    2024年02月07日
    浏览(57)
  • APP开发入门:了解主流的编程语言

    在过去的几年里,有许多程序员开始学习和使用编程语言。这其中包括C、C++、 Java和 Python。尽管有许多语言可供选择,但大多数程序员都会选择最容易学习的编程语言。 如今,有很多编程语言供选择。程序员们在学习这些语言时可以自由地选择他们喜欢的方式,因为他们的

    2024年02月15日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包