当前位置: 首页 > news >正文

【C++】入门【六】

本节目标


一、继承的概念及定义

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

三、继承中的作用域

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

五、继承与友元

六、继承与静态成员

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

八、继承的总结和反思

九、笔试面试题


一、继承的概念及定义

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

 

 

相关文章:

【C++】入门【六】

本节目标 一、继承的概念及定义 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 五、继承与友元 六、继承与静态成员 七、复杂的菱形继承及菱形虚拟继承 八、继承的总结和反思 九、笔试面试题 一、继承的概念及定义 1.继承的概念 继承是面向对象…...

UE5 C++ 不规则按钮识别,复选框不规则识别 UPIrregularWidgets

插件名称:UPIrregularWidgets 插件包含以下功能 你可以点击任何图片,而不仅限于矩形图片。 UPButton、UPCheckbox 基于原始的 Button、Checkbox 扩展。 复选框增加了不规则图像识别功能,复选框增加了悬停事件。 欢迎来到我的博客 记录学习过…...

Elasticsearch Serverless 现已正式发布

作者:来自 Elastic Yaru Lin 基于全新无状态(stateless)架构的 Elasticsearch Serverless 现已正式发布。它采用完全托管方式,因此你可以快速启动项目而无需操作或升级,并且可以使用最新的向量搜索和生成式 AI 功能。 …...

如何使用apache部署若依前后端分离项目

本章教程介绍,如何在apache上部署若依前后端分离项目 一、教程说明 本章教程,不介绍如何启动后端以及安装数据库等步骤,着重介绍apache的反向代理如何配置。 参考此教程,默认你已经完成了若依后端服务的启动步骤。 前端打包命令使用以下命令进行打包之后会生成一个dist目录…...

openEuler安装UKUI桌面

# 升级更新 sudo yum -y update # 安装UKUI界面 dnf install ukui # 设置图形启动 systemctl set-default graphical.target # 重启 # 查看当前系统启动模式 systemctl get-default # 修改默认启动模式为 命令行界面模式 systemctl set-default multi-user.target 在UK…...

深入理解Oracle DB的锁和闩

1. 引言 本文深入介绍Oracle DB的锁和闩。 2. Oracle DB 锁的基本概念 2.1 定义与作用 锁是 Oracle 数据库用于控制并发访问的一种机制。它用于防止多个事务同时对同一数据进行不一致的操作,确保数据的完整性和一致性。例如,当一个事务正在更新一行数…...

jenkins+github+springboot自动部署

背景: 最近看流水线有点意思,就说自己也搞一套。 预期效果: idea提交代码后,GitHub接收,jenkins自动部署。【后续加个自动部署时的代码检查、单元测试、安全测试、sonarqube】 思路分析: idea上的spring代码push到gi…...

HTML5系列(10)-- 地理位置服务指南

前端技术探索系列:HTML5 地理位置服务指南 🌍 致读者:探索位置服务的魅力 👋 前端开发者们, 今天我们将深入探讨 HTML5 的地理位置服务(Geolocation API),这项强大的功能让我们能…...

【MySQL 进阶之路】SQL 优化

6.SQL 性能分析笔记 在现代数据库的高并发环境下,SQL 查询优化成为提升系统性能和响应速度的关键。本文将总结常见的 SQL 优化策略,包括插入优化、主键设计、排序优化、GROUP BY 优化等,帮助你在面对大规模数据时,做到高效查询和…...

Web3的技术栈详解:解读区块链、智能合约与分布式存储

随着数字时代的不断发展,Web3作为下一代互联网的核心理念逐渐走进了大众视野。它承载着去中心化、用户主权以及更高效、更安全的网络环境的期望。Web3不再是由少数中心化机构主导的网络,而是通过一系列核心技术的支撑,给每个用户赋予了更多的…...

[在线实验]-在docker中运行clickhouse

镜像下载 docker的clickhouse镜像资源-CSDN文库 加载镜像 首先,需要获取ClickHouse的Docker镜像。如果已经有镜像文件(如clickhouse.tar),可以使用docker load命令来加载它: docker load --input clickhouse.tar …...

Rust常用命令总结

安装Rust 检查并更新Ubuntu的软件包 $ sudo apt update $ sudo apt upgrade安装相关依赖:安装GCC、G、MAKE、curl $ sudo apt install build-essential $ sudo apt install curl安装Rust $ curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh执行命令…...

Ant-Design X,AI组件库

前端的小伙伴们都知道有一个前端组件库超级火,可以说是 Top1 级别的,那就是 Ant-Design 而就在最近,他们又推出了一款新的组件库,Ant-Design X,这是专门用来做 AI 产品 的组件库,可能大家还很疑惑&#xf…...

Matplotlib 内置的170种颜色映射(colormap)

Matplotlib 提供了许多内置的颜色映射(colormap)选项,可以将数值数据映射到色彩范围——热力图、温度图、地图等可视化经常会用到。 # colormap 有两种引用形式plt.imshow(data, cmapBlues)plt.imshow(data, cmapcm.Blues) 颜色映射可以分为…...

在linux虚拟机安装VMware tools

安装UKUI桌面后,在火狐浏览器输入下载VMware tool地址: https://gitcode.com/open-source-toolkit/395d3/blob/5faa176939c7ac1f614a8b6f07f14cc31433ff95/VMwareTools-10.3.21-14772444.tar.gz 解压下载的软件包,进入目录:vmwa…...

初识EasyFramework

一、获取EF Git地址:https://github.com/HiWenHao/EFrameworkGitee地址:https://gitee.com/wang_xiaoheiiii/EFramework视频合集:EasyFramework介绍_哔哩哔哩_bilibiliQQ群: 711540505 二、 下载并初步了解 1. 下载完成后,可以看…...

OpenStack-Glance组件

Glance Glance使用磁盘格式和容器格式基础配置镜像转换 Glance 是 OpenStack 的镜像服务,负责存储、发现和管理虚拟机镜像。它允许用户创建和共享镜像,用于启动虚拟机实例。 Glance 的主要功能 (1)虚拟机镜像的管理 支持镜像的上…...

SPC三种判定准则的算法

1.连续6个点递增或递减 //传入数据列表 //返回连续X个及以上递增或递减的数组下标int n = array.Length; int X = X_in; List<int> regions_start = new List<int>(); List<int> regions_end = new List<int>();if(Open){for (int i = 0; i < n - (…...

20241129解决在Ubuntu20.04下编译中科创达的CM6125的Android10出现找不到库文件libncurses.so.5的问题

20241129解决在Ubuntu20.04下编译中科创达的CM6125的Android10出现找不到库文件libncurses.so.5的问题 2024/11/29 21:11 缘起&#xff1a;中科创达的高通CM6125开发板的Android10的编译环境需要。 vendor/qcom/proprietary/commonsys/securemsm/seccamera/service/jni/jni_if.…...

Mybatis @MapKey注解实现List转Map

文章目录 MapKey介绍MapKey示例- 传统的写法- MapKey的写法 MapKey介绍 在MyBatis中&#xff0c;MapKey 主要用于在映射查询结果到一个Map。 当你执行一个查询并期望返回一个Map时&#xff0c;你可以使用MapKey来进行结果集的映射。而Mybatis内部会将查询到的结果映射为一个k…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...

sshd代码修改banner

sshd服务连接之后会收到字符串&#xff1a; SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢&#xff1f; 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头&#xff0c…...

大数据驱动企业决策智能化的路径与实践

&#x1f4dd;个人主页&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、引言&#xff1a;数据驱动的企业竞争力重构 在这个瞬息万变的商业时代&#xff0c;“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...