【C++】入门【六】

news2024/12/26 9:12:10

本节目标


一、继承的概念及定义

二、基类和派生类对象赋值转换

三、继承中的作用域

四、派生类的默认成员函数

五、继承与友元

六、继承与静态成员

七、复杂的菱形继承及菱形虚拟继承

八、继承的总结和反思

九、笔试面试题


一、继承的概念及定义

1.继承的概念

  • 继承是面向对象程序设计中是代码可以复用的手段,允许了程序员在原有的类特性上进行扩展,增加功能,这样产生新的类,称为派生类
  • 继承呈现了面向对象程序设计的层次结构
  • 以前我们接触的复用都是函数复用,继承是类设计层次方面的复用
  • 用例如下
  • bdcc36140248446bb49a9a89b63230c7.png
  • b56e79cbb34c4029aacb8cc2d83512e0.png
  • f9d72ecc1a044605aa14fd1b15322d6a.png
  • f9dca081ff95495fbb7654ad77b6fa35.png

2.继承的定义

  • 父类跟子类,也叫基类跟派生类
  • 9715aba4d47947ebaddcdbf89b1aa1b9.png
  • 继承关系和访问限定符:
  • 继承又分为三种继承关系 public protected private
  • 117a2ccee68a43cabaa9e75b8127e34c.png
  • 继承后子类对父类的访问又分为三种 public protected private
  • 3a2e1eafbf2744a59bc9457e7aed6f67.png
  • 948fe2d84ffb44c4b107de35321aec04.png
  • 如果父类也就是基类,里面的函数和变量都是private的,
  • 那么子类/派生类继承后,也无法访问到父类里面的函数和变量
  • 如果父类里面是protected和private 就可以访问
  • protected比较特殊,跟private的不同是,private的所有东西子类和类外都不可以访问
  • 而protected则是 子类可以访问,类外不可以访问
  • 实际中我们都使用public继承,很少使用其他两种
  • 22b480e4b6844b419b1dcd714e7a3c75.png

二、基类和派生类对象赋值转换

  • 派生类可以赋值给基类的对象/指针/引用
  • 但是基类不可以赋值给派生类对象
  • 但是基类的指针/引用可以通过强制类型转换来赋值给派生类的指针/引用
  • 派生类赋值给基类时,其实基类是把派生类里自己的东西拿走,其他的东西不拿走,换个说法也叫切割或者切片,就是把派生类中基类的东西切掉赋值过去
  • 切割如图所示(子类student里父类的东西切割 送过去)
  • 60f5ef062710455abe1bf962ec7fc681.png
  • a93ab7bf1b574b03adb566e89988ed97.png
  • 925bd6410d854e109394a09aa3b5a2c5.png
  • 13ec51da1123400183b640ee047c672e.png
  • 8f1413e1bf2a48c1a9375258cc6c7623.png

三、继承中的作用域

  • 在继承体系中,基类和派生类都有自己的作用域
  • 如果基类和派生类中有同名成员, 子类将屏蔽父类的成员,这种情况叫做隐藏,也叫重定义
  • 如果不想屏蔽掉,想使用同名成员里的父类的,可以通过使用基类::基类成员来进行访问使用
  • 只要函数名相同就构成隐藏,不管返回值类型
  • 在继承体系中最好不要定义同名成员
  • 这里不展示类详细信息,看结论 
  • b652cb90e66a423588e4356110703257.png
  • 2d8ab253334d4d99b6f66aa270b246d8.png

四、派生类中的默认成员函数

  • 还是6个默认成员函数
  • 父类里面的成员变量 必须 通过父类的构造函数来初始化,子类不能初始化
  • 90f1842aff9b4a18921787b79b249d31.png
  • 36630b5de4024d948c0b9680c6fcf7d2.png

五、继承和友元

  • 友元关系不能继承
  • 基类的友元不能访问子类的私有成员和保护成员
  • 9e276280bf874bf3ad455e62788a7ea5.png

六、继承与静态成员

  • 基类如果定义了static静态成员,则整个继承体系里只有一个这样的成员
  • 子类也共用,无论派生出多少子类,都只有一个static成员
  • 额外补充 注意: static静态成员在类中声明,类外初始化 类外初始化不用加static
  • 比较简单,这里不做演示

七、复杂的菱形继承及菱形虚拟继承

1.各种继承

  • 单继承
  • 一个子类只有一个直接父类就叫单继承
  • 986036799fd04c34817337c80f08797a.png
  • 多继承
  • 一个子类有两个及以上直接父类叫多继承
  • eeeecd692d604be3aee8b58cb7a90d41.png
  • 菱形继承
  • 菱形继承是多继承的一种特殊情况
  • 361df89e21874f758ec3622989d91827.png
  • 关于菱形继承 有着很大的问题,由于多继承的出现就导致了菱形继承
  • 观察上图
  • student和teacher两个类继承了person 
  • 而assistant又同是继承了他俩
  • 那么在assistant里面 就有了两个同名的成员变量,此时如果访问的话,编译器就不知道是访问的谁的 student还是teacher的
  • 547b5ccdfe1c4a6388726ea46b62eba9.png
  • 1506156575ce44bba8f576c951b1936a.png
  • bec9efe2eaec4a0d98234ba8dd1b548a.png

2.虚拟继承

  • 为了解决掉这个问题
  • 此时出现了虚拟继承
  • 虚拟继承可以解决菱形继承中的二义性和数据冗余
  • 在上面的student和teacher 继承 person时加上virtual 即可解决问题
  • d748552b4fbc4810bfac325728b67c30.png
  • 注意:虚拟继承不要在其他地方使用 仅限于菱形继承

3.虚拟继承解决数据冗余和二义性的原理

  • 为了研究虚拟继承原理,我们给出了一个简化的菱形继承继承体系
  • 569f0cc9d9a74b04806e59ed0a4e9acb.png
  • 58273d912f634ce98f33e89b6d186f00.png
  • 191e1dc337e94987922ed1515628fadc.png
  • cd4475e76900404f96d96ce880d71169.png
  • a3f5fe7ae85e404985949e290b3aaefb.png

八、继承的总结和反思

  • 很多人说C++语法复杂,其实多继承就是一个体现,有了多继承,就存在了菱形继承,有了菱形继承就有了虚拟继承,底层实现就很复杂,所以一般不建议设计出多继承,在java里面是没有多继承的,菱形继承一定不要设计出来,复杂性太高
  • 多继承可以认为是C++的缺陷之一
  • 继承和组合
  • 继承是is的关系,组合是has的关系
  • 优先使用组合,而不是继承
  • 什么是组合? 下图  这里没用继承 将轮胎给到了车上
  • ce2b6237657c46ca83b3c267bd0f630a.png

九、笔试面试题

  • 1.什么是菱形继承?菱形继承的问题是什么?
  • 661b2a31fc414cd59a2d1909043a4309.png
  • 2.什么是菱形虚拟继承,如何解决数据冗余和二义性的?
  • a9acf3e8c238494bb2b690b1e6f7cfca.png
  • c4df5950ba3b4ba691b60cabcf643aa9.png
  • 3.继承和组合的区别?什么时候用继承?什么时候用组合?
  • 23bac4d61546476e9f203eb388e84751.png

 

 

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

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

相关文章

Docker--Docker Image(镜像)

什么是Docker Image? Docker镜像(Docker Image)是Docker容器技术的核心组件之一,它包含了运行应用程序所需的所有依赖、库、代码、运行时环境以及配置文件等。 简单来说,Docker镜像是一个轻量级、可执行的软件包&…

架构05-架构安全性

零、文章目录 架构05-架构安全性 1、软件架构安全的重要性 **系统安全:**不仅包括防御黑客攻击,还包括安全备份与恢复、安全审计、防治病毒等。**关注重点:**认证、授权、凭证、保密、传输安全、验证。 2、认证(Authenticatio…

elasticsearch-如何给文档新增/更新的字段

文章目录 前言elasticsearch-如何给文档新增/更新的字段1. 如何给某些文档新增/更新的字段2. 给所有文档添加/更新一个新的字段3. 测试 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且…

Ansible自动化一键部署单节点集群架构

自动化部署利器:Ansible 一键部署脚本 在现代IT基础设施管理中,Ansible以其简洁、强大的自动化能力脱颖而出。以下是精心打造的Ansible自动化一键部署脚本,旨在简化部署流程,提升效率,确保一致性和可靠性。 通过这个…

常见Linux命令(详解)

文章目录 常见Linux命令文件目录类命令pwd 打印当前目录的绝对路径ls 列出目录内容cd 切换路径mkdir 建立目录rmdir 删除目录touch 创建空文件cp 复制文件或目录rm 移除文件或者目录mv 移动文件与目录或重命名cat 查看文件内容more 文件分屏查看器less 分屏显示文件内容head 显…

数据库复习记录

边复习边整理。 数据库 数据库管理系统(DBMS):用来管理数据库的系统。 关系型数据库:二维表格(即关系)来存储数据,一个表对应一个关系,用SQL来查询数据。如MySQL、PostgreSQL、SQ…

Navicat连接SQL Server及SpringBoot连接SQL Server(jtds)

Navicat连接SQL Server 安装自带的SQL Server客户端 去到Navicat安装目录,找到安装程序,安装即可。 安装对应版本的Microsoft ODBC Driver for SQL Server 打开Navicat输入对应的SQL Server相关信息 然后点测试连接,提示连接成功。 Spr…

数字图像处理(15):图像灰度反转和彩色反转

(1)图像反转:是指对图像的颜色信息进行相反的处理,从而得到一个新的图像。在计算机视觉和图像处理领域,图像反转是一种常见的操作,它可以帮助我们实现不同的图像特效和视觉效果。 (2&#xff09…

Linux——基础命令(3)

1.Linux——基础命令(1)-CSDN博客 2.Linux——基础命令(2) 文件内容操作-CSDN博客 一、打包压缩 打包压缩 是日常工作中备份文件的一种方式 在不同操作系统中,常用的打包压缩方式是不同的选项 含义 Windows 常用 rar…

【力扣热题100】—— Day4.回文链表

正视自己的懦弱和无能,克服自己的嫉妒与不甘 —— 24.12.3 234. 回文链表 给你一个单链表的头节点 head ,请你判断该链表是否为 回文链表 。如果是,返回 true ;否则,返回 false 。 示例 1: 输入&#xff1a…

python源码实例游戏开发小程序办公自动化网络爬虫项目开发源码(250+个项目、26.6GB)

文章目录 源代码下载地址项目介绍预览 项目备注源代码下载地址 源代码下载地址 点击这里下载源码 项目介绍 python源码实例游戏开发小程序办公自动化网络爬虫项目开发源码(250个项目、26.6GB) 预览 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情…

AI与BI的火花:大语言模型如何重塑商业智能的未来

大家好,我是独孤风。 在当今这个数据驱动的时代,企业对于信息的需求如同对于氧气的需求一般至关重要。商业智能(BI)作为企业获取、分析和呈现数据的关键工具,正在经历一场深刻的变革,而这一变革的催化剂正是…

Pyside6 --Qt设计师--简单了解各个控件的作用之:Layouts,Spaces

目录 一、Layouts1.1 Vertical Layout说明1.1.1 Qt设计师图1.1.2 py代码 1.2 Horizontal Layout说明1.2.1 Qt设计师图1.2.2 py代码 1.3 Grid Layout说明1.3.1 Qt设计师图1.3.2 py代码 1.4 Form Layout说明1.4.1 Qt设计师图1.4.2 py代码 二、Spaces(空格)…

Multimodal Few-Shot Learning with Frozen Language Models译文

摘要 当经过足够规模的训练时,自动回归语言模型在只需要几个例子的提示下就能表现出学习新语言任务的显著能力。在这里,我们提出了一种简单而有效的方法,将这种少量学习能力转移到多模态环境(视觉和语言)。使用对齐的图…

电脑显示没信号显示屏不亮怎么办?电脑没信号解决方法

电脑没信号显示屏不亮这种故障的原因可能有多种,例如显示器的供电、连接、设置等问题,或者电脑的显卡、内存、硬盘、主板等硬件问题。所以我们想要解决这个问题,也是需要多方面排除找到具体原因然后进行修复。下面将为大家介绍一些常见的电脑…

docker中可视化rviz

docker中可视化rviz 背景1. 确定适合的 NVIDIA 驱动版本2. 检查 NVIDIA Container Toolkit 安装2.1 安装 NVIDIA Container Toolkit配置 NVIDIA Runtime重启 Docker验证 NVIDIA Docker 支持验证 OpenGL 和图形支持测试 GUI 应用验证 OpenGLlio_sam_rviz-9] process has died确认…

AC+AP漫游实验

实验拓扑 实验要求 1.AP1服务vlan10,AP2服务vlan20,实现三层漫游 2.AP1与AP2为不同AP组,直接转发 实验步骤 1.配置VLAN放行相关流量 交换机与AP接口为trunk口并修改PVID为30 2.配置相关业务使得ap上线 3.配置vap上线,AP可用…

力扣92.反转链表Ⅱ

题目描述 题目链接92. 反转链表 II 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left …

BERT和RoBERTa;双向表示与单向的简单理解

目录 BERT和RoBERTa大型预训练语言模型 BERT的原理 RoBERTa的原理 举例说明 双向表示与单向的简单理解 除了预训练语言模型,还有什么模型 一、模型类型与结构 二、训练方式与数据 三、应用场景与功能 四、技术特点与优势 BERT和RoBERTa大型预训练语言模型 BERT(Bi…

群控系统服务端开发模式-应用开发-短信工厂腾讯云短信开发

一、腾讯云短信工厂开发 1、添加框架对应的SDK composer require tencentcloud/tencentcloud-sdk-php 2、添加腾讯云工厂 在根目录下extend文件夹下Sms文件夹下channel文件夹下&#xff0c;创建腾讯云短信发送工厂并命名为TencentSmsSender。记住&#xff0c;一定要在腾讯云短…