4.4——多重继承

news2024/11/17 11:47:25

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

多重继承派生类的声明

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

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

{

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

}

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

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

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

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

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

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

{

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

}

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

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

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

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

虚基类

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

 

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

虚基类的概念

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

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

{

        ……

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

 

上述程序中,从类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与派生方式的关键字的先后顺序无关紧要,它们是等价的

7)一个基类在作为某些派生类的虚基类的同时,也可以作为另外派生类的非虚基类。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

K8S:二进制安装K8S(单台master)

目录 一、安装K8S 1、拓扑图​编辑 2、系统初始化配置 3、部署docker引擎 4、部署etcd集群 ①etcd简介 ②准备签发证书环境 ③etcd部署 5、master部署组件 6、 部署 Worker Node 组件 7、 node节点部署flannel网络插件 一、安装K8S 1、拓扑图​​​​​​​ 2、系…

C++好难(4):类和对象(下)

okk我们终于来到了C类和对象的最后一节,大多都是对之前学习的内容做的补充 所以加油继续冲啦! ∧_∧::   (・ω・):: /⌒  ⌒):: /へ__ / /:: (_\\ ミ)/::   &am…

一种轻松且客观介绍大模型方式,避免过度解读:一

这是我关于《一种轻松且客观介绍大模型方式,避免过度解读》第一篇 一、前言 这篇文章旨在为没有计算机科学背景的读者提供一些关于ChatGPT及其类似的人工智能系统(如GPT-3、GPT-4、Bing Chat、Bard等)如何工作的原理。ChatGPT是一种聊天机器…

【网络安全】mysql数据库提权

数据库提权 数据库提权适用场景前提条件提权步骤如何探查数据库服务是否启动 mysql提权mysql 获取数据库最高权限账号密码方法1.读取网站配置文件2. 读取数据库存储或备份文件3. 脚本暴力破解 利用udf提权udf定义udf提权原理udf常用函数1. 获取mysql版本号2.udf.dll放置到被攻击…

华为P60 Pro灵犀双Wi-Fi流畅通信,让你体验超凡网速

家里装有宽带的朋友,用手机进行无线网络连接时,经常会发现有2.4G和5G两个Wi-Fi信号网络。Wi-Fi信号是通过无线电波传输的,2.4G和5G是两个不同的频段,Wi-Fi信号就在这样的频段内进行传输。 2.4G信号频率低,在空气或障碍…

【机器学习】集成学习(理论)

集成学习(理论) 目录 一、何为集成学习二、集成学习最简单的模型:投票策略三、弱学习器的组合算法:自助聚合(Bagging模型)1、数据划分方法:自助法(Bootstrap Method)2、B…

决策树的介绍

一、介绍 决策树 (decision tree) 是一类常见的机器学习方法。它是一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果。 例如,我们要对"这是好瓜吗?&qu…

3.docker—应用部署MySQL

文章目录 1、mysql部署2、使用Navicat客户端来连接 docker应用部署 docker出现后,这些软件的安装会变得比较简单 1、mysql部署 四步走: 1️⃣搜索mysql镜像 2️⃣拉取mysql镜像 3️⃣创建容器 4️⃣操作 遇到问题: 容器内的网络服务和…

MySQL定时刷新数据

一、步骤 1.查看定时策略是否开启,查看命令: show variables like %event_sche%; 2.显示的 event_scheduler 为 OFF 时用以下命令开启: set global event_scheduler1; 3.创建存储过程 use toursim_platform; -- 选择数据库toursim_platform delimiter // create pro…

【刷题之路Ⅱ】LeetCode 86. 分隔链表

【刷题之路Ⅱ】LeetCode 86. 分隔链表 一、题目描述二、解题1、方法1——先分离再连接1.1、思路分析1.2、代码实现 2、方法2——将较大的节点后移2.1、思路分析2.2、代码实现 一、题目描述 原题连接: 86. 分隔链表 题目描述: 给你一个链表的头节点 head…

科大讯飞交卷,实测星火大模型

作者 | 辰纹 来源 | 洞见新研社 星星之火,可以燎原。 5月6日,讯飞星火认知大模型揭开神秘面纱。 发布会上,科大讯飞董事长刘庆峰、研究院院长刘聪现场实测了星火大模型七大核心能力,并发布基于该大模型的教育、办公、汽车和数字…

docker-mysql的几个问题

来水一篇文章 文章目录 问题一:问题2: 问题一: 在Navicat上执行大脚本mysql的sql文件时,出现插入数据报错的问题,查了一下innodb_log_file_size参数show variables like innodb_log_file_size;只有50331648即48M&…

WB_BF项目问题说明以及探究

我就现在WB_BF项目群里面提到的“根据测试脚本运行日志来看,bf运行了约31小时后又开始出现了api调用返回nginx的错误信息。之后,bf客户端也无法打开。”问题做一下说明,今天早上我在机器上复现了这一问题。针对于api调用会返回nginx的错误信息…

CTF权威指南 笔记 -第四章Linux安全机制-4.1-Linux基础

常用命令 这里给出linux常用命令 cd ls pwd 显示当前工作目录 uname 打印系统信息 whoami 打印用户名 man 查询帮助信息 find echo cat less head grep diff mv cp rm ps top kill touch 创建文件 mkdir 创建文件夹 chmod 变更权限 chown 变更所属者 nano 终端文本编辑器 e…

MySQL获取当前日期、时间、时间戳函数

目录 1.MySQL 获取当前日期时间 函数 1.1 获取当前日期(date)函数:curdate() 1.2 获取当前时间(time)函数:curtime() 1.3 获取当前日期时间(date time)函数:now() …

BClinux8.6 制作openssh9.3p1 rpm升级包和升级实战

一、背景说明 BClinux8.6 默认安装的openssh 版本为8.0,经绿盟扫描,存在高危漏洞,需要升级到最新。 官网只提供编译安装包,而BClinux8.6 为rpm方式安装。 为了方便升级,先通过编译安装包,制作rpm包&…

什么是无感电阻?无感电阻和普通电阻的区别

无感电阻,也称为电感电阻、电感器、电感元件等,是一种电气元件,常用于电子电路中,用于限制电流、防止电磁干扰等。无感电阻是指一种电阻器件,它能够在高频电路中工作而不会产生电感,从而避免了电感对电路性…

【Python】更改matplotlib绘图样式,要创建一个后缀名为mplstyle的样式清单,如何实现?

要更改 matplotlib 绘图样式,可以按照以下步骤创建一个后缀名为 mplstyle 的样式清单: 打开终端或 Anaconda Prompt(Windows 用户);确保您的 Matplotlib 版本是 2.0.0 以上版本,通过运行: imp…

被裁现状,给找工作的同学一些建议

2022 到 2023 国内知名互联网公司腾讯、阿里、百度、快手、滴滴、京东、阿里、爱奇艺、知乎、字节跳动、小米等公司均有裁员,其中有不少公司,在过去年的一整年,进行了多轮裁员,以下是网传的一张 “2022 年裁员企业名单”。 这些裁…

【单目标优化算法】孔雀优化算法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…