当前位置: 首页 > 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…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...