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

在这里插入图片描述


【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++语言系列学习目录

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

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

相关文章

C++_C++11的学习

1. 统一的列表初始化 1.1{}初始化 在C98 中,标准就已经允许使用花括号 {} 对数组或者结构体元素进行统一的列表初始值设定。而到了C11,标准扩大了用大括号括起的列表 ( 初始化列表 )的使用范围,使其能适用于所有的内…

最大连续1的个数(滑动窗口)

算法原理: 这道题大眼一看是关于翻转多少个0的问题,但是,如果你按照这种思维去做题,肯定不容易。所以我们要换一种思维去做,这种思维不是一下就能想到的,所以想不到也情有可原。 题目是:给定一…

ESP32-C6接入巴法云,Arduino方式

ESP32-C6接入巴法云,Arduino方式 第一、ESP32-C6开发环境搭建第一步:安装arduino IDE 软件第二步:安装esp32库第三:arduino 软件设置 第二:简单AP配网程序第一步:程序下载第二步:程序使用第三步…

linux centos nginx配置浏览器访问后端(tomcat日志)

1、配置nginx访问tomcat日志路径 vim /usr/local/nginx/conf/nginx,conflocation ^~ /logs {autoindex on;autoindex_exact_size on;autoindex_localtime on;alias /home/tomcat/apache-tomcat-9.0.89-1/logs;}###配置讲解### 1、location ^~ /logs { … }: location&#xf…

代码随想录——从前序与中序遍历序列构造二叉树(Leetcode105)

题目链接 递归 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

构建智能化商场存包柜平台的数据结构设计

随着城市生活节奏的加快,人们对于便利的需求也越来越迫切。在城市中,商场存包柜平台成为了解决人们日常出行中行李存放问题的重要设施。为了更好地管理和运营这些存包柜,智能化商场存包柜平台的数据结构设计显得尤为关键。 一、需求分析与功能…

每日AIGC最新进展(12):在舞蹈视频生成中将节拍与视觉相融合、Text-to-3D综述、通过内容感知形状调整进行 3D 形状增强

Diffusion Models专栏文章汇总:入门与实战 Dance Any Beat: Blending Beats with Visuals in Dance Video Generation https://DabFusion.github.io 本文提出了一种名为DabFusion的新型舞蹈视频生成模型,该模型能够根据给定的静态图像和音乐直接生成舞蹈…

韩顺平0基础学Java——第11天

p234-249 又一个月了,时间过得好快啊,希望支棱起来 可变参数 public int sum(int ... nums){ } 这个nums是数组 细节: 1可变参数可以为0个,或任意个 2可变参数的实参可以为数组 3可变参数的本质就是数组 4可变参数可以和普通…

MicroLED:苹果对知识产权的影响

Yole的洞察揭示,MicroLED IP在经历了七年的爆炸式增长后,已然屹立于行业之巅。苹果公司,作为微LED领域的先行者,早在2014年便敏锐地捕捉到Luxvue这家初创公司的潜力,将其纳入麾下,引发了业界的广泛关注。然…

基线管理概述

一、基线概念 ①安全基线 ②安全基线与英文排版的基线类似,是一条参考标准线。 ③安全基线表达了最基本需要满足的安全要求。 ④安全基线表达了安全的木桶原理木桶原理:一只木桶盛水的多少,并不取决于桶壁上最高的那块 木块,而恰恰取决于…

如何让大模型更聪明?提升AI智能的关键策略

如何让大模型更聪明?提升AI智能的关键策略 🤖 如何让大模型更聪明?提升AI智能的关键策略摘要引言方向一:算法创新🚀1.1 自监督学习的崛起1.2 强化学习的应用 方向二:数据质量与多样性📊2.1 数据…

大学校园广播“录编播”与IP广播系统技术方案

一、项目概述 1、校园IP网络广播系统概述 大学校园广播系统是学校整个弱电系统中的子系统,它是每个学校不可缺少的基础设施之一,在传递校园文化、传播校园新闻资讯方面发挥着重要的作用。近几年来,虽然视频技术和网络技术在飞速发展&#xf…

VS2022配合Qt与boost.asio实现一个TCP异步通信系统远程操作mysql数据库

上一篇博客我们通过boost.asio搭建了一个简单的异步服务器,但是那是基于命令行的,所有用起来还是相当枯燥的,这次我们配合Qt实现一个简陋的前端页面来控制后端mysql数据库中的表,实现添加密钥的功能(本次博客使用的boost版本是1.8…

AI智能体|手把手教你使用扣子Coze图像流的文生图功能

大家好,我是无界生长。 AI智能体|手把手教你使用扣子Coze图像流的文生图功能本文详细介绍了Coze平台的\x26quot;图像流\x26quot;功能中的\x26quot;文生图\x26quot;节点,包括创建图像流、编排文生图节点、节点参数配置,并通过案例…

Three.js 研究:3、创建一个高科技圆环

打开Alpha混合 修改环形颜色,更改发光的颜色,更改发光的强度为2 更改世界环境灯光

PyTorch学习笔记:新冠肺炎X光分类

前言 目的是要了解pytorch如何完成模型训练 https://github.com/TingsongYu/PyTorch-Tutorial-2nd参考的学习笔记 数据准备 由于本案例目的是pytorch流程学习,为了简化学习过程,数据仅选择了4张图片,分为2类,正常与新冠&#xf…

解决鼠标滚动时element-ui下拉框错位的问题

问题描述:elementUi的el-select下拉选择框,打开之后,直到失去焦点才会自动关闭。 在有滚动条的弹窗中使用时就会出现打开下拉框,滚动弹窗,el-select下拉框会超出弹窗范围的问题. 解决方案: 1、先在util文件夹下创建个hideSelect.js文件,代码…

《德米安:彷徨少年时》

文前 我之所愿无非是尝试依本性而生活, 却缘何如此之难? 强盗 疏于独立思考和自我评判的人只能顺应现成的世俗法则,让生活变轻松。其他人则有自己的戒条:正派人惯常做的事于他可能是禁忌,而他自认合理的或许遭他人唾…

GM Bali,OKLink受邀参与Polygon AggIsland大会

5月16日-17日,OKLink 受到生态合作伙伴 Polygon 的特别邀请,来到巴厘岛参与以 AggIsland 为主题的大会活动并发表演讲,详细介绍 OKLink 为 Polygon 所带来的包括多个浏览器和数据解析等方面的成果,并与 Polygon 一起,对…

深入解析BGP:互联网路由协议的全貌与应用

BGP(Border Gateway Protocol)是互联网上用于在自治系统(AS)之间交换路由信息的协议。它负责决定数据包的最佳路径以及路由的选择。以下是BGP的一些关键特点和工作原理的详细内容: BGP的特点: 1.路径矢量型…