C++继承与多态

一,继承

 1,继承定义

继承是C++三大特性之一。C++有类型的复用:类型模板,函数的复用:函数重载。而继承其本质是一种类的复用,使得程序员可以在原有类特性之上进行扩展来产生新的类,原有的类称为父类或基类,扩展出现的类称为子类或派生类。

继承后子类所有成员与成员函数都会成为子类的一部分。

定义父类,然后选择继承方式定义子类进行继承。

所谓继承方式就是程序员想要子类以何种权限看待父类中的成员,共存在三种继承方式:public,private,protected。类中成员也有相同的三种权限,我们可以将其一 一对应组成继承九宫格,每格对应每种继承情况。

基于这张表可以总结出:

(1)对于父类中的private成员,不管子类以何种方式继承,该成员在子类中都无法访问。

(2)对于其除private外的成员,他们在子类中的权限为:其自身在父类内的权限与子类的继承方式取两者最小的权限。

2,父,子类赋值转换

我们来看子类和父类对象之间的赋值操作:

我们分别定义父类对象p,子类对象s;如果我们将s赋值给p,其在编译器内部操作和其他并不一致。通常情况,不同类型变量间的赋值操作是:编译器内部操作是创建一个临时变量,然后将要赋的值拷贝在这个临时变量内,再将临时变量内的值拷贝到要赋值的变量中去。

当赋值操作左右两边是父类与子类对象时,编译器运用一种“切片”操作,编译器不创建临时变量,而是将子类中继承的成员的值直接拷贝到父类内,形象地如同将它切出来一样。

当我们用子类对象赋值父类对象的引用或指针时,例如person& ps = s,  person* pp = s;此时的操作是编译器将直接让ps变成s继承p的那一片成员的别名,而pp将会指向s继承p的那一片成员的地址。

2,继承中的作用域

继承对作用域做出了如下规定

   (1)子类和父类的作用域互相独立。

   (2)若子类和父类存在同名成员,此时子类将会屏蔽对该父类成员的直接访问,称为隐藏。如果用户需要访问的是父类的同名成员,可以使用作用域符 父类::父类成员 进行访问。

3,继承体系中的四种默认成员函数

默认构造函数:

(1)对于非继承的对象,默认构造函数对内置类型不处理,对自定义类型调用它的默认构造函数。

(2)子类中的默认构造函数会调用父类的默认构造函数来初始化自己从父类继承下来的成员。

我在父类和子类中显示地写了默认构造函数,如果某个类调用了它自己的默认构造函数,它将输出“我是xx类的默认构造函数”。运行如下:

析构函数:

(1)编译器会对子类和父类的析构函数进行特殊处理:将这两个类的析构函数函数名都转换成:~destructor(),因此子类析构函数与父类析构函数构成隐藏。

(2)子类的析构函数也会调用父类的析构函数,子类的析构函数会优先进行调用,然后自动调用父类的析构函数。

拷贝构造:

(1)子类的拷贝构造会调用父类的拷贝构造对继承下来的成员进行初始化。

赋值重载:

(1)子类的赋值操作会调用父类的赋值重载函数对继承下来的成员进行初始化。

4,多继承:

C++中支持多继承,一个子类可以继承多个父类,如果这多个父类又是由同一个子类继承而来,那么这种继承就是菱形继承。当多个父类从同一个子类继承相同成员时,这多个父类又被一个子类继承,那么对于该子类继承下来的数据,不知道该访问哪个父类的成员这就是数据的二义性。

二,多态

1,多态定义

多态指不同对象完成某个动作时会有不同的行为,多态是类的一种行为的接口。

多态需要满足两个条件:

(1)父类中需要有虚函数,并在子类进行重写。

(2)在(1)的情况下必须通过父类的指针或者引用对虚函数进行调用。

该函数在不同的类内被分别重写了。如果使用类对象调用虚函数只会发生普通调用,调用的是父类未被重写的函数。

满足多态的情况下有两种调用:

使用普通调用:使用类对象调用函数,调用的函数只与类型有关。

使用多态调用:使用对象指针或引用调用和指向的类型有关。

例如:

定义了一个cat对象c,并将animal*指向c。pa是animal*类型,指向的是c的地址。此时我用pa调用animalbark,发生的是多态调用,其调用只取决于pa指向的地址,pa指向的c的地址,因此调用的是c内成员函数,尽管pa是animal*类型。

而c使用普通调用,调用只与类型有关,因此调用c内成员函数

抽象类

抽象类是一种特殊的类,该类不能实例化对象,它只是作为其他类的接口。抽象类中的虚函数称为纯虚函数,规定子类必须对纯虚函数进行重写,否则报错。

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

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

相关文章

【深度学习】全连接神经网络

全连接神经网络 全连接神经网络的结构 整体结构 神经网络:类似神经元,前一层可以不断地传递给下一层。 神经网络模型由多个单元结构组成。 单元结构 单元结构的数学公式: a = h ( w x + b ) a=h(wx+b) a=h(wx+b) h(x):激活函数 比如sigmoid就是激活函数之一隐藏层大多…

Collections集合工具类-JAVA

java.util.Collections:是个集合工具类它不是集合&#xff0c;而是集合的工具类 常用 API&#xff1a;注意 binarySearch 方法要求元素有序 方法实现&#xff1a; public class Test01 {public static void main(String[] args) {ArrayList<String>list1new ArrayList…

TPH-YOLOv5:基于Transformer预测头改进的YOLOv5开发构建麦穗检测计数分析系统

关于小麦麦穗或者是麦粒相关的开发实践不多&#xff0c;但前文也有所涉及&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《基于轻量级yolov5nCBAM开发构建全球小麦麦穗智能检测计数系统》 《基于YOLOv5[n/s/m/l/x]全系列参数模型开发构建小麦麦穗颗粒智能化精准检…

TRIZ经典矛盾矩阵.exe

TRIZ经典矛盾矩阵.exe 一、概要二、技术细节I&#xff0e;函数open_dialog&#xff08;&#xff09;和open_version_dialog&#xff08;&#xff09;II&#xff0e;函数resolvent&#xff08;&#xff09;III&#xff0e;函数Invention_Principle_Content&#xff08;&#xff…

svn 安装路径

SVN客户端安装&#xff08;超详细&#xff09; 一、SVN客户端安装 1、下载安装包地址&#xff1a;https://tortoisesvn.net/downloads.html 此安装包是英文版的&#xff0c;还可以下载一个语言包&#xff0c;在同界面的下方 一直点击下一步&#xff0c;直到弹出选择红框 然…

You Only Look Once

You Only Look Once 真方便, 一行代码, 直接输出超炫效果图_哔哩哔哩_bilibili使用yolov8中等模型对视频进行分割, 视频播放量 465、弹幕量 0、点赞数 7、投硬币枚数 4、收藏人数 3、转发人数 2, 视频作者 宝安钢铁侠, 作者简介 一个分享国产电子DIY的阿婆主,啥也不会,就想分…

qt5-入门-信号槽理解+QMainWindow

参考&#xff1a; Qt 深入了解信号槽_w3cschool https://www.w3cschool.cn/learnroadqt/wz3t1j47.html Qt MainWindow_w3cschool https://www.w3cschool.cn/learnroadqt/uqjl1j4b.html 本地环境&#xff1a; win10专业版&#xff0c;64位 信号槽 最简单的例子&#xff1a;写一…

spring cache的使用(Redis)

要在Spring Boot应用中使用Redis作为缓存&#xff0c;你需要遵循一些步骤来配置和使用Redis。以下是使用Spring Cache抽象与Redis进行整合的详细说明&#xff1a; 1. 添加依赖 首先&#xff0c;需要在pom.xml中添加Spring Boot的Redis starter依赖以及缓存的starter依赖。这会…

我的创作纪念日和前端碎碎念

机缘 作为一个前端开发者&#xff0c;我一直热衷于将设计和技术相结合&#xff0c;尽可能提升用户体验。我最初成为创作者的初心源于学习记录&#xff0c;把创作当作一个笔记&#xff0c;希望把自己遇到的问题&#xff0c;以及学习到的实用技巧记录下来&#xff0c;方便学习回…

新书速览|Docker与Kubernetes容器运维实战

帮助读者用最短的时间掌握Docker与K8s运维技能 内容简介 随着云计算和容器技术的发展&#xff0c;Docker与Kubernetes已经成为各个企业首选的部署工具&#xff0c;使用它们可以提高系统的部署效率和运维能力&#xff0c;降低运维成本。本书是一本为初学者量身定制的Docker与Kub…

nodejs+vue+mysql校园失物招领网站38tp1

本高校失物招领平台是为了提高用户查阅信息的效率和管理人员管理信息的工作效率&#xff0c;可以快速存储大量数据&#xff0c;还有信息检索功能&#xff0c;这大大的满足了用户和管理员这两者的需求。操作简单易懂&#xff0c;合理分析各个模块的功能&#xff0c;尽可能优化界…

nodejs+vue+ElementUi学生兼职招聘求职系统b8t93

浏览器&#xff1a;谷歌浏览器课题主要分为三大模块&#xff1a;即管理员模块和学生、企业模块&#xff0c;主要功能包括&#xff1a;学生、企业、岗位类型、招聘信息、应聘信息、投诉建议等&#xff1b; 运行软件:vscode 前端nodejsvueElementUi 语言 node.js 框架&#xff1…

【MBtiles数据索引和服务发布】GeoServer改造Springboot番外系列二

xyz地图服务访问示例&#xff1a;http://192.168.1.240:8081/gmserver/raster/xyz/firstWP:Imagery-raster/{z}/{x}/{y}.jpg 访问示例如下&#xff1a; mbtiles目录结构 根据z&#xff0c;x&#xff0c;y获取对应mbtiles文件路径的工具方法 说明&#xff1a;重点是使用getMb…

STM32——I2C

通信协议见&#xff08;STM32——SPI&#xff09; 一、I2C协议 1.1 I2C协议介绍&#xff1b; I2C是&#xff08;Inter IC Bus&#xff09;是由Philips公司开发的一种通用数据总线&#xff1b; 有多根通信线&#xff1b; 一根SDA&#xff08;串行通信线&#xff09;&#xf…

PySpark(一)Spark原理介绍、PySpark初体验及原理

Spark简介 Apache Spark是用于大规模数据&#xff08;large-scala data&#xff09;处理的统一&#xff08;unified&#xff09;分析引擎&#xff0c;其特点就是对任意类型的数据进行自定义计算。 Spark VS Hadoop 尽管Spark相对于Hadoop而言具有较大优势&#xff0c;但Spark并…

Three.js 纹理贴图 - 环境贴图 - 纹理贴图 - 透明贴图 - 高光贴图

文章目录 Three.js 纹理贴图纹理贴图 map属性纹理贴图的映射方式 texture.Mapping纹理加载器 THREE.TextureLoader监听单个材质监听多个材质 - LoadingManager类 1. 颜色贴图与材质的颜色2.渲染效果&#xff1a;UV坐标 - 描述纹理贴图的坐标自定义顶点UVgeometry.attributes.uv…

Java 数据抓取

大家好我是苏麟 , 今天聊聊数据抓取 . 大家合理使用 注意&#xff0c;爬虫技术不能滥用&#xff0c;干万不要给别人的系统造成压力、不要侵犯他人权益! 数据抓取 实质上就是java程序模拟浏览器进行目标网站的访问&#xff0c;无论是请求目标服务器的接口还是请求目标网页内容…

python基础——池

池的介绍&#xff1a; 提前创建进程池&#xff0c;防止创建的进程数量过多导致系统性能受到影响&#xff0c;在系统执行任务时&#xff0c;系统会使用池中已经创建进程/线程&#xff0c;从而防止资源的浪费&#xff0c;创建的进程/线程可以让多个进程使用&#xff0c;从而降低…

Unity技术手册-UGUI零基础详细教程-Canvas详解

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

备战蓝桥杯---数据结构与STL应用(入门4)

本专题主要是关于利用优先队列解决贪心选择上的“反悔”问题 话不多说&#xff0c;直接看题&#xff1a; 下面为分析&#xff1a; 很显然&#xff0c;我们在整体上以s[i]为基准&#xff0c;先把士兵按s[i]排好。然后&#xff0c;我们先求s[i]大的开始&#xff0c;即规定选人数…