【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

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MacOS安装sshfs挂载远程电脑硬盘到本地

文章目录 sshfs简介sshfs安装下载安装macFUSE安装sshfs sshfs使用注意事项 sshfs简介 SSHFS(SSH Filesystem)是一种基于FUSE(用户空间文件系统)的文件系统,它允许你通过SSH协议挂载远程文件系统。使用SSHFS&#xff0…

亚马逊云(AWS)使用root用户登录

最近在AWS新开了服务器(EC2),用于学习,遇到一个问题就是默认是用ec2-user用户登录,也需要密钥对。 既然是学习用的服务器,还是想直接用root登录,下面开始修改: 操作系统是&#xff1…

深度学习中的迁移学习:应用与实践

引言 在深度学习领域,迁移学习(Transfer Learning)是一个非常强大且日益流行的概念,它通过将从一个任务中学到的知识应用于另一个任务,能够显著加快模型训练速度并提高其泛化能力。迁移学习在许多实际应用中都得到了广…

股市复盘笔记

复盘是股市投资中非常重要的一个环节,它指的是投资者在股市收盘后,对当天的市场走势、个股表现以及自己的交易行为进行回顾和总结,以便更好地指导未来的投资决策。以下是对复盘的详细解释: 一、复盘的目的 总结市场走势&#xff…

ubuntu18.04+qt 5.12.12+安装和实验

引用 【QT | 开发环境搭建】Linux系统(Ubuntu 18.04) 安装 QT 5.12.12 开发环境 ubuntu18.04 安装qt5.12.8及环境配置 1.安装包链接 第一篇中写了 http://download.qt.io/archive/qt/5.12/5.12.12/qt-opensource-linux-x64-5.12.12.run2.安装 到下载目录下 sudo chmod ax…

【目标跟踪】AntiUAV600数据集详细介绍

AntiUAV600数据集的提出是为了适应真实场景,即无人机可能会随时随地出现和消失。目前提出的Anti-UAV任务都只是将其看做与跟踪其他目标一样的任务,没有结合现实情况考虑。 论文链接:https://arxiv.org/pdf/2306.15767https://arxiv.org/pdf/…

LabVIEW氢同位素单质气体定量分装系统

氢同位素单质气体在多个行业中有重要应用,如能源和化工。传统的分装方法面临精度和自动化程度不足的问题。为此,开发了一套基于LabVIEW和质量流量控制器的定量分装系统,提高分装精度和效率,同时减少资源浪费和环境污染。 项目背景…

使用Oracle通过gateway连接MSSQL

环境概述 某医院的his系统Oracle数据库要和体检系统进行数据通讯,需要从Oracle能查到sqlserver的数据。本次通过Oracle gateway来解决此问题。 HIS服务器:windows server 2016数据库oracle11.2.0.4,假设IP是192.168.100.9 体检服务器&…

跑一下pyapp

文档:How-to - PyApp 首先没有rust要安装 安装 Rust - Rust 程序设计语言 查看是否安装成功 然后clone下pyapp https://github.com/ofek/pyapp/releases/latest/download/source.zip -OutFile pyapp-source.zip 进入目录中,cmd,设置环境…

Vue网页屏保

Vue网页屏保 在vue项目中&#xff0c;如果项目长时间未操作需要弹出屏幕保护程序&#xff0c;以下为网页屏保效果&#xff0c;看板内容为连接的资源。 屏保组件 <template><div v-if"isActive" class"screensaver" click"disableScreens…

项目基于oshi库快速搭建一个cpu监控面板

后端&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.github.oshi</groupId><artifactId>oshi-…

【LLMs】用LM Studio本地部署离线大语言模型

文章目录 一、下载LM Studio二、下载大语言模型1. 查看模型介绍2. 点击模型文件进行下载2.1 完整下载2.2 部分下载 三、加载模型1. 打开LM Studio图形化界面&#xff0c;点击**My Models**2. 然后&#xff0c;点击“...”&#xff0c;选择“change”&#xff0c;选择刚下载好的…

Redis——主从复制原理

Redis的主从复制原理是其高可用性和分布式读取能力的重要基础。以下是Redis主从复制原理的详细解释&#xff1a; 一、主从复制的基本概念 Redis的主从复制是一种数据复制和备份的方式&#xff0c;它允许一个主节点&#xff08;Master&#xff09;将其所有的数据同步到一个或多…

单链表---合并两个链表

将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 struct ListNode {int val;struct ListNode* next; }; w 方法一---不使用哨兵位 我们创建一个新链表用于合并两个升序链表&#xff0c; 将两个链表中最小的结点依次尾插到…

【AI系统】MobileNet 系列

MobileNet 系列 在本文会介绍 MobileNet 系列&#xff0c;重点在于其模型结构的轻量化设计&#xff0c;主要介绍详细的轻量化设计原则&#xff0c;基于这原则&#xff0c;MobileNetV1 是如何设计成一个小型&#xff0c;低延迟&#xff0c;低功耗的参数化模型&#xff0c;可以满…

25.k个一组翻转链表 python

k个一组翻转链表 题目题目描述示例 1&#xff1a;示例 2&#xff1a;提示&#xff1a;题目链接 题解解题思路python实现代码分析提交结果 题目 题目描述 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&…

开源即时通讯与闭源即时通讯该怎么选择,其优势是什么?

在选择即时通讯软件时&#xff0c;应根据企业的经营领域来选择适合自身需求的开源或闭源方案。不同领域对开源和闭源即时通讯的理念存在差异&#xff0c;因此总结两个点简要分析这两种选择&#xff0c;有助于做出更明智的决策。 一、开源与闭源的根本区别在于软件的源代码是否…

etcd分布式存储系统快速入门指南

在分布式系统的复杂世界中&#xff0c;确保有效的数据管理至关重要。分布式可靠的键值存储在维护跨分布式环境的数据一致性和可伸缩性方面起着关键作用。 在这个全面的教程中&#xff0c;我们将深入研究etcd&#xff0c;这是一个开源的分布式键值存储。我们将探索其基本概念、特…

大语言模型微调与 XTuner 微调实战

1 大语言模型微调 1.1 什么是微调 大语言模型微调&#xff08;Fine-tuning of Large Language Models&#xff09;是指在预训练的大型语言模型基础上&#xff0c;使用特定任务的数据进一步训练模型&#xff0c;以使其更好地适应和执行特定任务的过程&#xff0c;用于使LLM&am…

计算机网络复习5——运输层

运输层解决的是进程之间的逻辑通信问题 两个主机进行通信归根结底是两个主机中的应用程序互相通信&#xff0c;又称为“端到端的通信” 端口 运行在计算机中的进程是用进程标识符来标志的。但不同的操作系统标识进程的方法不统一&#xff0c;因特网重新以统一的方法对TCP/IP…