【C++面向对象】--- 继承 的奥秘(上篇)

news2025/2/8 4:49:50

个人主页:平行线也会相交💪
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【C++之路】💌
本专栏旨在记录C++的学习路线,望对大家有所帮助🙇‍
希望我们一起努力、成长,共同进步。🍓
在这里插入图片描述

C++支持面向对象,其中面向对象有三大特性,即继承、封装、多态

今天先来带大家认识一下C++中的继承,以作一个初步的了解,同时也能够更好的理解这门非常有吸引力的编程语言—C++

目录

  • 一、什么是继承
    • 继承的定义
    • 继承方式和访问限定符
    • 继承基类成员访问方式的变化
    • 小总结
  • 二、基类和派生类的赋值兼容转换
    • 切片过程不产生临时变量
    • 小总结

一、什么是继承

继承的概念

继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。
继承的本质是一种复用。

我们在学习STL的模拟实现时经常会用到函数的复用,而继承其实就是类层次上的复用

我们倒不如举个例子,请看:

class Person
{
public:
	void Print()
	{
		cout << "name:" << _name << endl;
		cout << "age:" << _age << endl;
	}
protected:
	string _name = "Tom";
	int _age = 18;
};

class Student : public Person
{
protected:
	int _stuid;
};

class Teacher
{
protected:
	int _jobid;
};

继承的定义

我们把Student称为子类(也称派生类),Person称为父类(也称基类),即Person就是被继承的类(有点子承父业的感觉)。
在这里插入图片描述

继承方式和访问限定符

继承方式(三种):public继承,protected继承,private继承。
访问限定符(三种):public访问,protected访问,private访问。

继承基类成员访问方式的变化

类成员/继承方式public继承protected继承private继承
基类的public成员派生类的public成员派生类的protected成员派生类的private成员
基类的protected成员派生类的protect成员派生类的protected成员派生类的private成员
基类的private成员在派生类中不可见在派生类中不可见在派生类中不可见

我们可以看到基类的私有(private)成员在派生类中不可见无论子类以什么方式继承都无法使用。这里的不可见的意思就是语法上限制访问(类里类外都不可以使用),但是内存上时存在的。
不可见又区别于private,private的意思就是类外面不可以使用,而类里面是可以使用的。
在这里插入图片描述

小总结

  • 1.出去基类的私有成员外,基类其他成员在子类的访问方式=Min(成员在基类的访问限定符,继承方式),public>protected>private。
  • 2.protected的使用时机:我们已经知道基类的私有成员在派生类中是不可以使用的;现在如果基类成员不想在类外面被直接访问,但需要在派生类中能够访问,此时我们就定义为protected。
  • 3.使用关键字class时默认的继承方式为private,使用关键字struct默认的继承方式为public
  • 4.在实际运用中一般使用都是public继承,几乎很少使用protetced/private继承,也不提倡使用protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里面使用,实际中扩展维护性不强。

二、基类和派生类的赋值兼容转换

首先我们要明确父类对象是不能赋值给子类对象的,但子类对象是可以赋值给父类对象的。我们把子类对象赋值给父类称为向上转换父类对象赋值给子类称为向下转换

Person p;//父类
Student s;//子类
p = s;//父类对象是不能赋值给子类对象的,但是子类对象可以赋值给父类对象

那为什么父类对象不能赋值给子类对象呢?因为子类的某些成员在父类中并不存在。
在这里插入图片描述

切片过程不产生临时变量

首先我们要知道不同类型的对象之间赋值会产生类型转换(分为强转和隐转)。

不同类型的变量之间进行赋值需要产生临时变量,请看:

//这里赋值会产生临时变量
int a = 10;
double b = a;

先说结论:切片过程中不会产生临时变量,即派生类对象赋值给基类对象时并不会产生临时变量。请看举例:

int a = 10;
//临时变量具有常性,故需要加const进行修饰
const double& b = a;

Person p;
Student s;
Person p1 = s;//不需要加const修饰
Person& rp = s;//不需要加const修饰
//由此可以证明切片过程不产生临时变量

解释const double& b = a;b是临时变量的别名。而Person p1 = s;Person& rp = s;不会产生临时变量。
如图:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

小总结

  • 派生类对象可以赋值给基类的对象/基类的指针/基类的引用。我们将其称为切片
    或者切割
    。即把派生类中父类那部分切来赋值过去
  • 基类对象不能赋值给派生类对象。(即支持向上转换而不支持向下转换
  • 基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。但是必须是基类的指针是指向派生类对象时才是安全的。这里基类如果是多态类型,可以使用RTTI(Run-Time Type Information)的dynamic_cast 来进行识别后进行安全转换。

好了,本文到这里就结束啦!再见啦,友友们!!!
在这里插入图片描述

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

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

相关文章

git强推覆盖其他项目分支

git强推分支&#xff0c;覆盖其他分支&#xff1b; 操作&#xff1a; 下载branch-1.3代码&#xff1b; $ git clone gitlabgitlab.zte.net:zte-dba-service/branch.git $ git remote add origin2 gitlabgitlab.zte.net:zte-service/branch.git $ git push origin2 master -f注…

UE 5 GAS 在项目中处理AttributeSet相关

这一篇文章是个人的实战经验记录&#xff0c;如果对基础性的内容不了解的&#xff0c;可以看我前面一篇文章对基础的概念以及内容的讲解。 设置AttributeSet 使用GAS之前&#xff0c;首先需要设置参数集AS&#xff0c;这个是用于同步的一些参数&#xff0c;至于如何设置GAS&a…

腾讯云Linux服务器创建、使用和配置的教程

腾讯云Linux服务器创建&#xff0c;先注册腾讯云账号&#xff0c;购买云服务器配置然后选择Linux镜像操作系统&#xff0c;包括云服务器地域、CVM实例、公网IP等配置&#xff0c;然后远程链接到腾讯云服务器快速配置使用教程&#xff1a; 目录 腾讯云Linux服务器创建 创建Li…

远程控制医疗行业应用解析:如何满足医院合规需求?

远程控制医疗行业应用解析&#xff1a;如何满足医院合规需求&#xff1f; 作为一个起源于IT行业的技术&#xff0c;以远程桌面为基础的远程控制技术目前在医疗领域也已经有了比较广阔的应用前景&#xff0c;尤其是在医疗数字化系统/设备的远程运维场景&#xff0c;已经有了一些…

Spring Profile与PropertyPlaceholderConfigurer实现项目多环境配置切换

最近考虑项目在不同环境下配置的切换&#xff0c;使用profile注解搭配PropertyPlaceholderConfigurer实现对配置文件的切换&#xff0c;简单写了个demo记录下实现。 基本知识介绍 Profile Profile通过对bean进行修饰&#xff0c;来限定spring在bean管理时的初始化情况&#…

K8S调度

K8S调度 一、List-Watch 机制 controller-manager、scheduler、kubelet 通过 List-Watch 机制监听 apiserver 发出的事件&#xff0c;apiserver 通过 List-Watch 机制监听 etcd 发出的事件1.scheduler 的调度策略 预选策略/预算策略&#xff1a;通过调度算法过滤掉不满足条件…

CH344Q/L USB转四串口芯片资料下载(合集)

1、产品手册 CH344DS1.PDF - 南京沁恒微电子股份有限公司CH344技术手册&#xff0c;USB转4串口芯片&#xff0c;支持最高6M波特率与硬件流控&#xff0c;支持USB配置功能&#xff0c;提供RS485方向控制与GPIO等信号引脚&#xff0c;可实现PC等平台扩展多串口或多个串口设备升级…

多维时序 | MATLAB实现ZOA-CNN-BiGRU-Attention多变量时间序列预测

多维时序 | MATLAB实现ZOA-CNN-BiGRU-Attention多变量时间序列预测 目录 多维时序 | MATLAB实现ZOA-CNN-BiGRU-Attention多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.Matlab基于ZOA-CNN-BiGRU-Attention斑马优化卷积双向门控循环单元网络…

ARTS 挑战打卡的第7天 --- Ubuntu中的WindTerm如何设置成中文,并且关闭shell中Tab键声音(Tips)

前言 &#xff08;1&#xff09;Windterm是一个非常优秀的终端神器。关于他的下载我就不多说了&#xff0c;网上很多。今天我就分享一个国内目前没有找到的这方面的资料——Ubuntu中的WindTerm如何设置成中文&#xff0c;并且关闭shell中Tab键声音。 将WindTerm设置成中文 &…

Markdown的简单语法学习

简单掌握Markdown语法&#xff1a; 1、标题&#xff1a; 如果一段文字被定义为标题&#xff0c;只要在这段文字前面加#即可。 # 一级标题 ## 二级标题 ### 三级标题 2、列表&#xff1a; 列表分有序列表和无序列表&#xff1a; ###### 无序列表 * 1 * 2 * 3- 1 - 2 - 3#####…

echarts饼图例子

效果 代码&#xff1a;index。vue <div class"riskStatisticsBox"><div class"titleBox">风险统计</div><div class"contentBox"><div class"selectGroupBox"><div class"categoryBox">…

Vc - Qt - 绘制窗口背景色

要在Qt中绘制一个背景颜色&#xff0c;你可以使用Qt的绘图功能来完成。下面是一种简单的方法&#xff1a; 步骤1&#xff1a;在你想要绘制背景颜色的QWidget&#xff08;例如QMainWindow或QDialog&#xff09;的派生类中&#xff0c;重写 它的paintEvent函数。步骤2&#xff1a…

模拟信号和数字信号的转换

此文章介绍的模拟信号与数字信号转换相关的知识有如下&#xff1a; 通信原理的PCM脉冲编码调制 数字电子技术的A/D与D/A 以及stm32的ADC与DAC 模拟信号是指-----时间和数值均连续变化的电信号&#xff0c;如正弦波、三角波等。 数字信号是指-----在时间上和数值上均是离散的…

antv l7每次刷新无法加载iconFont

如图&#xff0c;只渲染出了文本&#xff0c;未渲染出iconFont 但是如果我跳转到其他页面再跳转回来(未经过刷新时)&#xff0c;可以展示出iconFont 解决&#xff1a; 查看官方源码后 找到了iconfont.tsx文件 可以看到多了一步font loaded&#xff0c; 放到项目中后再次测试&…

【01】基础知识:typescript安装及使用,开发工具vscode配置

一、typescript 了解 typeScript 是由微软开发的一款开源的编程语言。 typeScript 是 javascript 的超级&#xff0c;遵循最新的 es6、es5规范。 typeScript 扩展了 javaScript 的语法。 typeScript 更像后端 java、C# 这样的面向对象语言&#xff0c;可以让 js 开发大型企…

全球与中国工程机械轮胎市场现状及未来发展趋势

工程机械轮胎是装于专用性作业的工程机械车辆上&#xff0c;例如装载机、推土机、挖掘机、平整土地机、压路机和石方作业机等。行驶速度不高&#xff0c;但使用的路面条件和载荷性能要求苛刻。 工程机械轮胎行业目前现状分析 轮胎主要采用斜交和子午结构&#xff0c;从轮胎断面…

力扣1137.第N个泰波那契数(动态规划)

/*** author Limg* date 2023/08/11* 泰波那契序列 Tn 定义如下&#xff1a; * T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2* 给你整数 n&#xff0c;请返回第 n 个泰波那契数 Tn 的值。 */ #include<iostream> using namespace std; int tribonacci…

Java 包装类(Wrapper)

Wrapper概念 Java是一个面向对象的编程语言&#xff0c;但是Java中的八种基本数据类型却是不面向对象的&#xff0c;为了使用方便和解决这个不足&#xff0c;在设计类时为每个基本数据类型设计了一个对应的类进行代表&#xff0c;这样八种基本数据类型对应的类统称为包装类(Wra…

Android中Matrix的简单使用

Android中Matrix的简单使用 1.简介&#xff1a; Matrix 是一款微信研发并日常使用的应用性能接入框架&#xff0c;支持iOS, macOS和Android。 Matrix 通过接入各种性能监控方案&#xff0c;对性能监控项的异常数据进行采集和分析&#xff0c;输出相应的问题分析、定位与优化建…

08-3_Qt 5.9 C++开发指南_Graphics View绘图架构

文章目录 1. 场景、视图与图形项1.1 场景1.2 视图1.3 图形项 2. Graphics View 的坐标系统2.1 图形项坐标2.2 视图坐标2.3 场景坐标2.4 坐标映射 3. Graphics View 相关的类3.1 QGraphicsView 类的主要接口函数3.2 QGraphicsScene 类的主要接口函数3.3 图形项 4. 实例介绍 1. 场…