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

news/2024/5/6 10:32:31/文章来源:https://blog.csdn.net/FDS99999/article/details/132638794

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

多重继承

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

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

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

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

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

在多重继承关系中,派生类的对象包含有每个基类的子对象。
在这里插入图片描述

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

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

//显式地初始化所有基类
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中定义的虚函数

在这里插入图片描述

多重继承下的类作用域

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

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

虚继承

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

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

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

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

指定虚基类的方式是在派生列表中添加关键字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;}
};

构造函数与虚继承

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

虚继承的对象的构造方式

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

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

一个类可以有多个虚基类。这些虚基类子对象按照它们在派生列表中出现的顺序依次构造。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_166228.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试题 ⑤

1、TCP与UDP的区别 UDPTCP是否连接无连接,即刻传输面向连接,三次握手是否可靠不可靠传输,网络波动拥堵也不会减缓传输可靠传输,使用流量控制和拥塞控制连接对象个数支持一对一,一对多,多对一和多对多交互通…

软件架构Architecture篇卷首语

2023年9月2日,周六晚上 我为什么要开始学习软件架构?我为什么要专门开始这个专栏? 原因如下: Well-structured software is delivered in half the time, at half the cost, with 8x less bugs ——US Air Force study 这句话是我…

Navicat连接数据库报2003错误解决办法

是防火墙还没有开启 查看防火墙管理的端口 设置3306防火墙开启,重载防火墙 连接成功

第6讲:利用VBA获得指定行、列中最后一个非空单元格

【分享成果,随喜正能量】修行佛法从哪儿下手呢?要从信心下手。佛法大海,唯信能入。三皈依就是世间获得吉祥如意,出世间获得究竟解脱的正因,慎勿退失,谨守修行。。 《VBA代码解决方案》(10028096)这套教程是…

8.(Python数模)马尔科夫链预测

Python实现马尔科夫链预测 马尔科夫链原理 马尔科夫链是一种进行预测的方法,常用于系统未来时刻情况只和现在有关,而与过去无关。 用下面这个例子来讲述马尔科夫链。 如何预测下一时刻计算机发生故障的概率? 当前状态只存在0(故…

Python之作业(一)

Python之作业(一) 作业 打印九九乘法表 用户登录验证 用户依次输入用户名和密码,然后提交验证用户不存在、密码错误,都显示用户名或密码错误提示错误3次,则退出程序验证成功则显示登录信息 九九乘法表 代码分析 先…

【Day-27慢就是快】代码随想录-二叉树-二叉树的最小深度

给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明: 叶子节点是指没有子节点的节点。 —————————————————————————————————— 1. 递归法 确定单层递归的逻辑: 与最…

makefile开发应用程序的一个通用模板

下面是一个通用的 Makefile 模板,用于开发 C 语言应用程序: # 编译器设置 CC gcc CFLAGS -Wall -Wextra -stdc99# 可执行文件名 TARGET your_program# 源文件和对象文件 SRCS main.c file1.c file2.c OBJS $(SRCS:.c.o)# 默认目标 all: $(TARGET)#…

【哈士奇赠书活动 - 36期】- 〖Django Web 开发实例精解〗

文章目录 ⭐️ 赠书 - 《Django Web开发实例精解》⭐️ 内容简介⭐️ 作者简介⭐️ 编辑推荐⭐️ 赠书活动 → 获奖名单 ⭐️ 赠书 - 《Django Web开发实例精解》 ⭐️ 内容简介 《Django Web开发实例精解》详细阐述了与Django相关的基本解决方案,主要包括模型和数据…

AtCoder Beginner Contest 318

目录 A - Full Moon B - Overlapping sheets C - Blue Spring D - General Weighted Max Matching E - Sandwiches F - Octopus A - Full Moon #include<bits/stdc.h> using namespace std; const int N1e65; typedef long long ll ; const int maxv4e65; typedef …

原子操作的原理和实现

目录 相关术语 处理器如何实现原子操作 Java如何实现原子操作 循环CAS实现原子操作 使用锁机制实现原子操作 原子操作是指一个或者多个不可再分割的操作。这些操作的执行顺序不能被打乱。 相关术语 缓存行&#xff1a;缓存的最小操作单位 &#xff08;面试题、重点&…

SQL查询本年每月的数据

--一、以一行数据的形式&#xff0c;显示本年的12月的数据&#xff0c;本示例以2017年为例&#xff0c;根据统计日期字段判断&#xff0c;计算总和&#xff0c;查询语句如下&#xff1a;selectsum(case when datepart(month,统计日期)1 then 支付金额 else 0 end) as 1月, sum…

植物大战僵尸各种僵尸攻略(一)

前言 此文章为“植物大战僵尸”专栏中的004刊&#xff08;2023年9月第2刊&#xff09;&#xff0c;欢迎订阅。版权所有。 注意&#xff1a; 1.本博客适用于pvz无名版&#xff1b; 2.pvz指植物大战僵尸&#xff08;Plants VS Zonbies)&#xff1b; 3.本文以耗费低做标准&am…

企业应用系统 PHP项目支持管理系统Dreamweaver开发mysql数据库web结构php编程计算机网页

一、源码特点 PHP 项目支持管理系统是一套完善的web设计系统 应用于企业项目管理&#xff0c;从企业内部的各个业务环境总体掌握&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 php项目支撑管理系统2 二、功能介绍 (1)权限管理&#xff1…

PaddleNLP使用Vicuna

LLaMA 模型 LLaMa 是一个大型语言模型&#xff0c;由 Meta 开源。它的全称是 Large Language Model Meta AI&#xff0c;参数量从 70 亿到 650 亿不等。例如&#xff0c;130 亿参数的 LLaMA 模型在大多数基准上可以胜过参数量达 1750 亿的 GPT-3&#xff0c;而且可以在单块 V1…

Python中的绝对和相对导入

在本文中&#xff0c;我们将看到Python中的绝对和相对导入。 Python中导入的工作 Python中的import类似于C/C中的#include header_file。Python模块可以通过使用import导入文件/函数来访问其他模块的代码。import语句是调用import机制的最常见方式&#xff0c;但它不是唯一的…

2023/9/3周报

目录 摘要 文献阅读1 1、标题和提出问题 2、物理模型对于水质预测的缺陷 3、模型框架 4、相关公式 5、结果分析 文献阅读2 1、标题和提出问题 2、问题叙述 3、模型框架 4、误差修补 5、实验结果和分析 总结 摘要 本周阅读了2篇论文&#xff0c;分别为一种基于深…

C++ Primer 第3章 字符串、向量和数组

C Primer 第3章 字符串、向量和数组 3.1 命名空间的using声明一、每个名字都需要独立的using声明二、头文件不应包含using声明三、一点注意事项 3.2 标准库类型string3.2.1 定义和初始化string对象一、直接初始化和拷贝初始化 3.2.2 string对象上的操作一、读写string对象二、读…

CVPR2022 Semi-Supervised Semantic Segmentation Using Unreliable Pseudo-Labels

Semi-Supervised Semantic Segmentation Using Unreliable Pseudo-Labels 使用不可靠的伪标签的半监督语义分割 Paper&#xff1a;https://openaccess.thecvf.com/content/CVPR2022/html/Wang_Semi-Supervised_Semantic_Segmentation_Using_Unreliable_Pseudo-Labels_CVPR_202…

Python 没有 pip 包问题解决

最近需要搞一个干净的Python,从官网上直接下载解压可用的绿色版&#xff0c;发现无法正常使用PiP 一 官网下载Python https://www.python.org/downloads/ 选择 embeddable package,这种是免安装的包&#xff0c;解压后可以直接使用。 二 配置环境变量 添加环境变量&#xff1a…