C++中的继承——第二篇

一、继承与友元

友元关系不能够继承(就像父亲的朋友不一定是自己的朋友)

具体实现起来就是父类的友元可以访问父类的成员,但是不可以访问子类的成员

二、继承与静态成员

子类的静态成员变量本质上与父类的是同一份,存储在静态区中,所以可以继承

例如

class Person
{
public:
    static int _count = 0
}

可以直接继承到子类

三、单继承与多继承

3.1单继承是什么?

一个子类只有一个直接父类,如:

class Student : public Person
{}

3.2多继承

3.2.1定义

一个子类有两个及以上的直接父类,如:

class Assistant : public Student,public Teacher
{}

3.2.2菱形继承中的数据冗余和二义性

用例子来说明:

如图,Student与Teacher都继承自Person,而Assistant又多继承了Student与Teacher,那么这时候Student与Teacher中属于Person的那一部分就会出现冗余,我们称之为数据冗余

当我们运行下面一段代码的时候

Assistant a;
a._name;

此时我们会发现在Assistant中有两份_name,一份属于Student,一份属于Teacher,因此运行时会因为不知访问那个而报错,我们称之为二义性

3.2.3virtual:虚继承

按照之前分析,我们已经知道了数据冗余和二义性的存在,那么应该如何解决它呢?

为此,我们引入了virtual关键字来完成虚继承的概念,虚继承后,我们可以得到如下图的存储方式:

使用虚继承的方法也很简单,只需要在继承共有父类的时候加上virtual关键字:

class Student: virtual public Person
{}
3.2.3补:复杂菱形继承时的位置

假如要完成如下图的复杂菱形继承

分析可知,在继承A的时候会出现数据冗余和二义性的问题,因此我们要在

A->B

A->C

这两个继承的时候使用virtual来修饰

3.3总结

在实际应用当中,我么并不推荐使用菱形继承,因为这会降低代码可读性(虽然iostream就是菱形继承),但是使用多继承是完全没问题的

四、继承和组合

4.1两者的本质都是:复用

4.1补:黑盒测试和白盒测试的概念

白盒测试:可见底层代码的实现,是对代码功能的实现过程进行测试,对技术要求高

黑盒测试:不可见代码的底层实现,直接对代码的功能进行测试,对技术要求低

4.2is-a关系与has-a关系(特指类之间的关系)

public继承是一种is-a关系,就是说每个派生类对象都是一个基类对象

组合是一种has-a关系,假设B组合了A,每个B对象中都有一个A对象,例如我们在vector类模板中在成员变量列表使用了迭代器类来作为成员变量

4.2补:在程序设计中,我们推荐“高内聚,低耦合”的代码形式

其中低耦合特指两个类之间关系,我们希望类与类之间关系不要太紧密。

4.3组合的好处

组合的原则是在类中少放公用,大多在保护中实现,仅仅向外展示功能接口,因此组合十分符合低耦合的形式

4.4继承与组合的对比

①继承允许根据基类的实现来定义派生类的实现,这种以生成派生类为目的的复用,我们称为白箱复用,但是因为白箱可视度高,所以基类的改变对派生类影响很大,耦合度比较高

②对象组合是继承之外的另一种复用方式,class Person中定义保护成员hand h1;

而hand是另外实现的一个类,这时两个类之间体现出了对象组合

在这个例子中,我们称hand类被Person类组合了,被组合的对象通常需要有良好的接口,这种复用风格成为黑箱复用,因为对象内部不可见,耦合度低

4.5is-a与has-a关系的应用场景

has-a关系时用对象组合,例如人体和手

is-a关系时用继承,例如植物和水果

当has-a与is-a都符合的时候,用组合,如list与queue

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

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

相关文章

uni-app发起请求以及请求封装,上传及下载功能(六)

文章目录 一、发起网络请求1.使用及封装2. https 请求配置自签名证书3.拦截器 二、上传下载1.上传 uni.uploadFile(OBJECT)2. 下载 uni.downloadFile(OBJECT) 一、发起网络请求 uni-app中内置的uni.request()已经很强大了,简单且好用。为了让其更好用,同…

SLAM定位总结

文章目录 一、激光定位1.A-LOAM (2018)2.F-LOAM (2021)3.CT-ICP (2022)3.DLO:Fast Localization with Dense Point Clouds (2022)4.kiss-ICP :In Defense of Point-to-Point ICP Sim…

大端存储和小端存储

大端存储和小端存储 在计算机系统中,数据在内存中的存储方式并不是唯一的。对于多字节的数据类型(如 int、float 等),计算机可以以不同的方式在内存中存储它们。这些存储方式通常分为两种:大端存储(Big-En…

【数据结构二叉树】C非递归算法实现二叉树的先序、中序、后序遍历

引言: 遍历二叉树:指按某条搜索路径巡访二叉树中每个结点,使得每个结点均被访问一次,而且仅被访问一次。 除了层次遍历外,二叉树有三个重要的遍历方法:先序遍历、中序遍历、后序遍历。 1、递归算法实现先序、中序、后…

【LeetCode】移除链表中等于设定值的元素、反转链表

主页:HABUO🍁主页:HABUO 🌜有时候世界虽然是假的,但并不缺少真心对待我们的人🌛 1. 移除链表中设定值的元素 题目:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所…

程序员日志之DNF手游1023版本活动补充

目录 传送门正文日志1、概要2、正文 传送门 SpringMVC的源码解析(精品) Spring6的源码解析(精品) SpringBoot3框架(精品) MyBatis框架(精品) MyBatis-Plus SpringDataJPA SpringClo…

macOS开发环境配置与应用开发教程

macOS开发环境配置与应用开发教程 引言 macOS是一个强大的操作系统,广泛应用于软件开发,尤其是iOS和macOS应用开发。本文将详细介绍如何配置macOS开发环境,并通过实例演示如何进行应用开发。希望通过这篇文章,帮助读者快速上手m…

提高交换网络可靠性之认识STP根桥与端口角色

转载请注明出处 该实验旨在学习如何选举根桥与识别端口角色。 1.三台交换机按要求连线,改名,分别为S1,S2,S3,以S1为例: 2.在S1上配置优先级为28672 同理,在交换机S2和S3上配置其优先级为32768&…

基于大数据的热门旅游景点数据分析系统的设计与实现

作者主页:编程千纸鹤 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参…

【大语言模型】ACL2024论文-03 MAGE: 现实环境下机器生成文本检测

【大语言模型】ACL2024论文-03 MAGE: 现实环境下机器生成文本检测 目录 文章目录 【大语言模型】ACL2024论文-03 MAGE: 现实环境下机器生成文本检测目录摘要研究背景问题与挑战如何解决核心创新点算法模型实验效果(包含重要数据与结论)主要参考工作后续优…

A012-基于Spring Boot的私房菜定制上门服务系统的设计与实现

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统私房菜定制上门服务系统信息管理难度大,容错率…

ios 快捷指令扩展(Intents Extension)简单使用 swift语言

本文介绍使用Xcode15 建立快捷指令的Extension,并描述如何修改快捷指令的IntentHandler,带参数跳转主应用;以及展示多个选项的快捷指令弹框(配置intentdefinition文件),点击选项带参数跳到主应用的方法 创建快捷指令 快捷指令是…

【MacOS实操】如何基于SSH连接远程linux服务器

MacOS上远程连接linux服务器,可以使用ssh命令pem秘钥文件连接。 一、准备pem秘钥文件 如果已经有pem文件,则跳过这一步。如果手上有ppk文件,那么需要先转换为pem文件。 macOS 的默认 SSH 客户端不支持 PPK 格式,你需要将 PPK 文…

Puppeteer点击系统:解锁百度流量点击率提升的解决案例

在数字营销领域,流量和搜索引擎优化(SEO)是提升网站可见性的关键。我开发了一个基于Puppeteer的点击系统,旨在自动化地提升百度流量点击率。本文将介绍这个系统如何通过模拟真实用户行为,优化关键词排名,并…

Golang | Leetcode Golang题解之第524题通过删除字母匹配到字典里最长单词

题目: 题解: func findLongestWord(s string, dictionary []string) (ans string) {m : len(s)f : make([][26]int, m1)for i : range f[m] {f[m][i] m}for i : m - 1; i > 0; i-- {f[i] f[i1]f[i][s[i]-a] i}outer:for _, t : range dictionary …

019集——获取CAD图中多个实体的包围盒(CAD—C#二次开发入门)

如下图所示,获取多个实体的最大包围盒,用红色线表示: 也可单独选圆的包围盒 部分代码如下: using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; using A…

【快速上手】pyspark 集群环境下的搭建(Yarn模式)

目录 前言: 一、安装步骤 安装前准备 1.第一步:安装python 2.第二步:在bigdata01上安装spark 3.第三步:同步bigdata01中的spark到bigdata02和03上 二、启动 三、可打开yarn界面查看任务 前言: 上一篇介绍的是…

sublime python出现中文乱码怎么办

一、乱码现象 利用sublime自带编译快捷方式ctrlB会出现中文乱码的情况。 print("没有循环数据!") print("完成循环!") 二、寻找原因 1、由于之前我已经安装了插件ConvertToUTF8,排除文本编码错误问题。 2、相同的代码在插件sublimerepl搭建的…

第三届北京国际水利科技博览会将于25年3月在国家会议中心召开

由中国农业节水和农村供水技术协会、北京水利学会、振威国际会展集团等单位联合主办的第三届北京国际水利科技博览会暨供水技术与设备展(北京水利展)将于2025年3月31日至4月2日在北京•国家会议中心举办! 博览会以“新制造、新服务、新业态”…

RHCE DNS

DNS DNS1.1 DNS介绍1.2 安装bind,配置文件1.3 正向解析文件模板1.4 反向解析文件模板1.5 转发服务器实验1.6 解析web服务器实验1.7 区域传送克隆虚拟机 DNS 1.1 DNS介绍 DNS系统 域名系统(DNS)是一个分层的分布式数据库。它存储用于将Inter…