【C++语言】继承:类特性的扩展,重要的类复用!

news2024/11/15 16:38:07

在这里插入图片描述


【C++语言】继承,更进一步的复用

  • ✨精美思维导图奉上
  • 继承
    • 1. 继承的相关概念:
    • 2. 继承的定义:
      • (1)定义格式:
      • (2)访问限定符和继承方式:
      • (3)默认继承方式:
    • 3.基类和派生类的关系:
      • (1)基类和派生类的类型转换过程:
      • (2)作用域:基类和派生类有各自的作用域:
    • 4. 派生类的默认成员函数:
    • 5. 友元与静态成员的继承:
    • 6. 多继承:
    • 7. 组合与继承:
    • 8. 两种无法继承的类:
  • 总结
  • C++语言系列学习目录


✨精美思维导图奉上

看不清戳这里【继承思维导图】
在这里插入图片描述


继承

1. 继承的相关概念:

继承: 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。以前我们接触的复用都是函数复用,继承是类设计层次的复用。

2. 继承的定义:

(1)定义格式:

class 派生类 : 继承方式 基类 {};

在这里插入图片描述

(2)访问限定符和继承方式:

在这里插入图片描述
继承方式和访问限定符都是:public、protected、private组成。

对于普通类来说,访问限定符中protected和private是一样的,只是类内部访问。但涉及继承的话就有所区别了。或者说protected就是为了继承才出现的。

继承与访问限定符之间是存在密切的联系的:我们可以用权限来排序:public>protected>private。
子类中,父类成员的访问权限的大小,取决于父类访问限定符和继承方式权限最小的那个决定。
比如:

public继承,就保留基类(父类)原有访问限定符修饰,不做任何更改:
  1. public修饰的成员可以被子类或者外部访问。
  1. protected修饰的成员只能被子类访问而不能被外部访问。
  1. private修饰的成员,只有自己内部可以访问。
如果是protected继承:
父类中的 public的成员,在子类对象中,是以 protected的权限来修饰的。因此父类对象,可以外部调用父类public成员,而子类对象,却不能外部调用该继承的成员。
同样道理private继承:
如果是 private继承,则父类所有成员都是私有,子类无法访问,外部也无法访问。这样的继承在实际中,用处很少。

(3)默认继承方式:

为了兼容C语言,默认继承方式和默认访问限定符上,struct和class都是有所区别的:
  • struct: 默认继承方式和默认访问限定符都是public
  • class: 默认继承方式和默认访问限定符都是private

3.基类和派生类的关系:

(1)基类和派生类的类型转换过程:

转换过程分为向上转换和向下转换:

1. 向下转换:基类 —> 派生类

  1. 派生类对象不能用基类对象赋值转换:赋值不完全,比如派生类特有的成员属性不能被赋值。
  2. 派生类指针or引用,可以用基类的地址or对象来赋值。

2. 向上转换:派生类 —> 基类

  1. 继承向上转换的过程,会发生赋值兼容,也叫切片或者切割。
  2. 基类对象用派生类对象赋值,是被允许的。
  3. 基类指针or引用,可以派生类地址or对象来赋值 (表示的是:指向派生类中父类部分的地址或别名)

举个例子:Student对象—>Person对象 其中 _No部分就被切片掉了,Person对象的赋值也是完整的。
在这里插入图片描述

(2)作用域:基类和派生类有各自的作用域:

每个类都有自己的作用域,继承中也当然不意外,我是想借着作用域谈论一些问题:

1. 派生类访问基类成员:
  • 成员变量: 如果基类和派生类存在同名情况(重定义),就近原则,访问派生类中的;如果不存在同名情况,派生类中,可以向上查找 (在派生类中没有发现该成员变量,就会自动去基类寻找)
  • 成员函数: 如果函数名相同(重定义),就不会调用基类的函数,哪怕参数不同,也不会去调用,只会报编译错误。比如:基类是func(),派生类是func(int a);调用是func();不会向上找,只会报错。
2. 三大重要概念的区分:
  • 函数重载:相同作用域中,两个或多个函数名相同,参数不同的函数,构成函数重载。
  • 重写(覆盖): 分别定义在基类和派生类的同名虚函数满足函数名、参数、返回值都相同(协同例外)的条件下构成重写,也叫覆盖。(多态会详细说明)
  • 重定义(隐藏) 两函数分别定义在基类和派生类作用域,函数名相同。除去重写就是重定义,也叫隐藏。

4. 派生类的默认成员函数:

在这里插入图片描述

5. 友元与静态成员的继承:

(1)友元函数不继承: 就像你父亲的朋友,不一定是你的朋友,需要后期培养(主动声明)。
(2)静态成员继承: 派生类可以使用静态成员,但是静态成员不属于派生类,属于基类。也就是派生类继承不包括静态成员。

6. 多继承:

多继承是C++的大坑语法,Java就吸取教训,没有这么复杂。我们一起来了解下:
(1)正常多继承: 多继承用来描述一些对象的,比如一个对象可能是老师,也是学生,所以同时具有老师和学生的特征。这当然是没问题的,也很符合面向对象的观点。

正常多继承格式:

class 派生类 :继承方式 基类1,继承方式 基类2,··· {}

(2)菱形继承: 一个类通过多个路径继承同一个基类,称为菱形继承。就比如上述举的例子,老师和学生,但在老师类和学生类中,他们都是继承人这个类,所以这个对象在Teacher中有一份Person的基础属性,在Student中又有一份Person的基础属性,比如姓名,性别,身份证。这些东西这个对象只需要一个就可以了。

举例:B、D、E、C构成的菱形继承
在这里插入图片描述
如果按照正常继承的方式继承:我们得到的C对象内部结构如下图:
在这里插入图片描述

  • 菱形继承的问题: 数据冗余和二义性: 存在两份重复基类的成员变量,调用时无法明确调用哪一个,或者说对于这个对象本身,存在两份就是错误的。

  • 解决菱形继承问题: 虚继承。

  • 虚继承效果: 将基类的成员变量单独放置,多存储一个指针,指针指向为当前与基类成员变量的偏移量。若出现菱形继承情况,只存一个基类成员变量,不同派生类更改偏移量即可访问。记录偏移量的指针往往相近,所以被称作“虚基表”,可以存储在代码段(常量区)。

虚继承的格式:

class 派生类 virtual 继承方式 基类 {}

注意:最后继承不能用虚继承。
在这里插入图片描述
按照上述方式虚继承,C对象结构如下:
在这里插入图片描述

菱形继承是大坑,除了适合出题,没有其他,在实际过程中,最好是别写菱形继承

7. 组合与继承:

左:组合 ---- 右:继承
在这里插入图片描述

(1)组合:耦合度相对低一些(得到的权限小,关联度低些),两个类之间是has-a的关系;黑盒子:对类成员并不明确;只有public可以访问,只受public函数更改而影响。

(2)继承:耦合度更高(得到的权限大,关联度高些),基类与派生类是is-a的关系;白箱子:对基类结构清楚;public和protected都可访问,更改会受到影响。

8. 两种无法继承的类:

(1)final修饰的类:class 类名 final{};
(2)将类的构造函数和析构函数设为private


总结

继承是C++的语言的一重大进步,更加的面向对象,但存在一些缺陷,需要避免。

世界还有很多值得探索,所以请 天天开心! 🎈

在这里插入图片描述


C++语言系列学习目录

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

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

相关文章

取代或转型?人工智能对软件测试的影响(内附工具推荐)

在当今快速发展的数字环境中,从移动App到基于Web的平台,软件已成为我们日常生活和工作不可或缺的一部分。然而,随着软件系统变得越来越复杂,如何确保其质量和可靠性已成为开发人员和测试人员所面临的一大重要挑战。 这就是软件测…

强化学习,第 3 部分:蒙特卡罗方法

文章目录 一、介绍二、关于此文章三、无模型方法与基于模型的方法四、V函数估计4.1 基本概念4.2 V-功能 五、Q 函数估计5.1 V函数概念5.2 优势5.3 Q函数 六、勘探与勘探的权衡七、结论 一、介绍 从赌场到人工智能:揭示蒙特卡罗方法在复杂环境中的强大功能    强化…

生命在于学习——Python人工智能原理(2.1)

二、机器学习 1、机器学习的定义 机器学习是指从有限的观测数据中学习出具有一般性的规律,并利用这些规律对未知数据进行预测的方法,通俗的讲,机器学习就是让计算机从数据中进行自动学习,得到某种知识。 传统的机器学习主要关注…

深度强化学习 Actor-Critic演员评论家 PPO

将策略(Policy Based)和价值(Value Based)相结合的方法:Actor-Critic算法,在强化学习领域最受欢迎的A3C算法,DDPG算法,PPO算法等都是AC框架。 一、Actor-Critic算法简介 Actor-Critic从名字上看包括两部分,演员(Actor…

Geoserver发布shp图层服务的样式控制及样式生成方式

在利用geoserver发布视频图层服务时,shp图层的样式可以在QGis文件中进行编辑;shp文件编辑后,需要导出样式文件,并在geoserver中进行注册,发布时对应shp图层文件时,需要选中对应样式,加载图层服务…

WorkPlus移动应用平台集成单点登录,实现统一门户解决方案

随着企业数字化转型的深入,移动办公已经成为企业提高工作效率和员工协作的重要途径。为了更好地管理企业移动应用,提升员工体验,简化登录流程,许多企业开始采用集成单点登录技术的企业移动应用平台,实现统一门户的目标…

实验室课程|基于SprinBoot+vue的实验室课程管理系统(源码+数据库+文档)

实验室课程管理系统 目录 基于SprinBootvue的实验室课程管理系统 一、前言 二、系统设计 三、系统功能设计 1管理员功能模块 2学生功能模块 3教师功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介…

PMP考试通关秘籍

考试大纲 考试大纲:考察维度3 个(人、过程、商业环境);更加贴近真实项目趋势;侧重点从做事到关注人;对于项目经理的软技能要求更高,匹配 PM 能力模型。 人员(42%)&…

55页PDF|人工智能通用大模型(ChatGPT)的进展、风险与应对(附下载)

👉获取方式: 😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

3D技术的应用领域

3D技术在现代科技和工业中有广泛的应用,其涵盖的领域非常广泛,从娱乐到医学,再到制造业和建筑,3D技术正在改变我们理解和互动的方式。以下是一些主要的应用领域。北京木奇移动技术有限公司,专业的软件外包开发公司&…

k8s devops实战教程+生产实践+可就业

k8s devops实战教程 简介教程涉及到内容教程获取学习教程后的收货助学群 简介 越来越多的企业应用云原生化,催生很多应用的部署方式也发生了很多变化。 从物理机部署应用过度到虚机部署应用再到应用容器化,从单应用再到服务拆分为微服务,靠人…

linux查看是否被入侵(一)

1、查看当前系统状态 [rootbastion-IDC ~]#top #一般挖矿等病毒点用CPU比较大 2、查看当前登录用户(w\who) 3、检查系统日志 检查系统错误登陆日志,统计IP重试次数 [rootbastion-IDC ~]# lastb 4、查看近期用户登录情况 [rootkvm01 ~]# last -n 5 #-n 5 表示…

element el-table表格表头某一列表头文字或者背景修改颜色

效果如下 整体代码 &#xff0c;具体方法在最下面&#xff01; <el-table v-loading"listLoading" :data"sendReceivList" element-loading-text"Loading" border fit ref"tableList" :header-cell-class-name"addClass&quo…

揭秘APP广告变现的高效秘诀:如何让你的APP更赚钱?

在数字化时代&#xff0c;APP已成为人们获取信息、娱乐休闲的重要平台。对于许多内容创作者来说&#xff0c;如何通过APP实现盈利&#xff0c;是一个亟待解决的问题。而APP广告变现项目&#xff0c;正是其中一种备受关注的盈利模式。那么&#xff0c;如何有效地利用APP广告变现…

安泰电子:功率放大器的选择方法有哪些

选择适合的功率放大器是实现电子系统中的关键步骤之一。以下是一些选择功率放大器的常用方法和考虑因素&#xff1a; 功率需求&#xff1a;首先确定你的系统需要多大的功率输出。功率输出需求通常由被驱动设备的功率要求决定。计算出所需功率后&#xff0c;选择一个具有适当功率…

绿色阅读:旧书回收,让知识循环

在快节奏的现代社会中&#xff0c;知识的获取和更新速度日新月异。然而&#xff0c;在这个信息爆炸的时代&#xff0c;我们是否曾想过&#xff0c;那些曾经陪伴我们度过无数日夜、给予我们智慧和启迪的旧书&#xff0c;在它们完成使命后&#xff0c;是否应该被遗忘在角落&#…

IdentiFace——多模态人脸识别系统,可捕捉从情绪到性别的所有信息及其潜力

1. 概述 面部识别系统的开发极大地推动了计算机视觉领域的发展。如今&#xff0c;人们正在积极开发多模态系统&#xff0c;将多种生物识别特征高效、有效地结合起来。 本文介绍了一种名为 IdentiFace 的多模态人脸识别系统。该系统利用基于 VGG-16 架构的模型&#xff0c;将人…

Go 语言安装部署(超详细版本)

在学习和使用 Go 语言时&#xff0c;正确的安装和配置是非常重要的一步。本文将介绍如何在不同操作系统上安装 Go 语言&#xff0c;并讨论一些常见的配置选项&#xff0c;帮助读者更好地了解和使用 Go 语言。无论是初学者还是有一定经验的开发者&#xff0c;都能从本文中获得有…

buuctf-相册

题目提示找到邮箱 下载是一个apk文件 他都不建议安装到手机了 我还是不找麻烦动调了吧 他说是mail,那行吧 找mail 找到就是这一段 base64 s3 notebook 这里可以看见加载了native库 所以要IDA 打开so文件 apk就是一个压缩包,直接解压就行 lib里面就有so文件 再根据熟知的…

深度剖析整型和浮点型数据在内存中的存储(C语言)

目录 整型在内存中的存储 为什么整型在内存中存储的是补码&#xff1f; 大小端字节序 为什么有大端小端&#xff1f; 浮点型家族 浮点数在内存中的存储 long long 整型在内存中的存储 整型在内存中有三种二进制表示形式&#xff1a;原码&#xff0c;反码&#xff0c;补码…