【C++进阶学习】第一弹——继承(上)——探索代码复用的乐趣

前言:

在前面,我们已经将C++的初阶部分全部讲完了,包括类与对象、STL、栈和队列等众多内容,今天我们就进入C++进阶部分的学习,今天先来学习第一弹——继承

目录

一、什么是继承?为什么会有继承?

二、继承的基本概念

2.1 继承的定义

2.2 继承关系和访问限定符

2.3 继承方式所带来的权限问题

三、基类和派生类的赋值转换

四、总结


一、什么是继承?为什么会有继承?

所谓继承,其实就是对代码复用的一种手段,通过一个已经存在的类来建立一个新类,并简化代码,比如当我们创建一个教师类和一个学生类的时候,他们所包含的信息分别是:学生:姓名、年龄、学号,老师:姓名、年龄、工号。

对于这样两个类,他们所包含的信息有很高的重合度,如果我们写两个类来包含各自的信息,就会显得比较冗余,尤其当我们的代码量很大的时候,如何来复用代码,对于我们简化代码就很重要。下面我们通过上面所说的教师类和学生类来引出我们的继承!

不用继承:

#include<iostream>
#include<string>
using namespace std;
class Teacher    //教师类
{
public:void print(){cout << _name << endl;cout << _age << endl;}
private:string _name = "zhangsan";    //名字int _age = 20;   //年龄string _jobid;   //工号
};
class student
{
public:void print(){cout << _name << endl;cout << _age << endl;}
private:string _name = "zhangsan";    //名字int _age = 20;   //年龄string _jobid;   //学号
};
int main()
{Teacher t;student s;t.print();s.print();return 0;
}

我们会发现这样的一段代码非常冗余,相同的成员变量和成员函数却要写两次,接下来我们就通过继承来简化这段代码

继承:

#include<iostream>
#include<string>
using namespace std;
class Person
{
public:void Print(){cout << "name:" << _name << endl;cout << "age:" << _age << endl;}
protected:string _name = "peter"; // 姓名int _age = 18;  //年龄
};class Student : public Person   
{
protected:int _stuid; // 学号
};
class Teacher : public Person
{
protected:int _jobid; // 工号
};
int main()
{Student s;Teacher t;s.Print();t.Print();return 0;
}

二、继承的基本概念

2.1 继承的定义

上面我们定义的Person类为父类,student和teacher类都是基类

2.2 继承关系和访问限定符

2.3 继承方式所带来的权限问题

描述:

上面所说的不可见其实就是不能直接访问的意思,通过上面的表格我们可以得到一个规律:派生类的权限大小取决于父类中成员的开放程度和继承方式,并且是以两者中权限小的为准

三、基类和派生类的赋值转换

基类和派生类有一个挺重要的问题就是互相之间的赋值转换,因为两者之间相似点还是很多的,所以他们两个之间是否可以相互转换呢?

答案是:派生类可以赋值给基类,但是基类不能赋值给派生类

派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类的引用 。这里有个形象的说法叫切片
或者切割。寓意把派生类中父类那部分切来赋值过去。

如图所示:

下面我们给出赋值各种情况的代码,建议仔细阅读一下:

#include<iostream>
#include<string>
using namespace std;
class Person
{
protected:string _name; // 姓名string _sex;  //性别int _age; // 年龄
};
class Student : public Person
{
public:int _No; // 学号
};
void Test()
{Student sobj;// 1.子类对象可以赋值给父类对象/指针/引用Person pobj = sobj;Person* pp = &sobj;Person& rp = sobj;//2.基类对象不能赋值给派生类对象sobj = pobj;// 3.基类的指针可以通过强制类型转换赋值给派生类的指针pp = &sobj;Student * ps1 = (Student*)pp; // 这种情况转换时可以的。ps1->_No = 10;pp = &pobj;Student* ps2 = (Student*)pp; // 这种情况转换时虽然可以,但是会存在越界访问的问//题ps2->_No = 10;  //这就是越界访问的情况
}

四、总结

上面只是简单的讲了一下C++继承的一些知识,由于我们近期考试周的缘故,暂时就先写这么多了,下一篇我们将详细地介绍继承中一些更难的问题,比如多继承,菱形继承等问题,今天的文章就先到这了,感谢观看

感谢各位大佬观看,创作不易,还请各位大佬点赞支持一下下呀!!!

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

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

相关文章

构建实时搜索与推荐系统:Elasticsearch与业务结合

在当今这个信息爆炸的时代&#xff0c;搜索引擎和推荐系统已成为我们日常生活中不可或缺的一部分。它们不仅帮助我们快速找到所需信息&#xff0c;还根据我们的喜好推荐相关内容&#xff0c;提升了用户体验。本文将探讨如何使用Elasticsearch构建实时搜索与推荐系统&#xff0c…

WPS JS宏获取自动筛选后的行数

//WPS JS宏获取自动筛选后的行数 function getFilterRowCnt(shtRng)//shtRng表示筛选目标工作表范围 {let lngRowCnt 0;for(let rngCell of shtRng.SpecialCells(xlCellTypeVisible).Areas)//获取自动筛选后的单元格行数{lngRowCnt lngRowCnt rngCell.Rows.Count;}return ln…

Web--CSS基础

文章目录 定义方式选择器文本字体背景边框元素展示格式内边距与外边距盒子模型位置浮动实战&#xff1a;个人信息卡片 flex布局响应式布局 定义方式 行内样式表 直接定义在style属性中&#xff0c;作用于当前标签 <img src "/imges/logo.jpg" alt "" …

Vue37-非单文件组件

一、组件的两种编写形式&#xff1a; 非单文件组件&#xff1b;单文件组件。 二、创建一个组件 2-1、组件中的el 组件中不写el&#xff0c;不说为谁服务。 2-2、组件中的data 因为对象形式&#xff0c;多处复用的话&#xff0c;有引用关系&#xff0c;改一处&#xff0c;另一…

atcoder ABC 355-C题详解

atcoder ABC 355-C题详解 ​ Problem Statement There is an NN grid, where the cell at the i-th row from the top and the j-th column from the left contains the integer N(i−1)j. Over T turns, integers will be announced. On Turn i, the integer Ai​ is anno…

[Nacos]No spring.config.import property has been defined

在学习 Spring Cloud Alibaba &#xff0c;Nacos组件&#xff0c;创建一个cloudalibaba-config-nacos-client&#xff0c;加载多配置集时遇到问题 配置了 bootstrap.yml 后启动项目报错&#xff1a; 是因为在springcloud 2020.0.2版本中把bootstrap的相关依赖从spring-cloud-s…

算法分析与设计期末考试复习GDPU

重点内容&#xff1a; 绪论&#xff1a; 简单的递推方程求解 1.19(1)(2) 、 教材例题 多个函数按照阶的大小排序 1.18 分治法&#xff1a; 分治法解决芯片测试问题 计算a^n的复杂度为logn的算法&#xff08;快速幂&#xff09; 分治法解决平面最近点对问…

OpenCV单词轮廓检测

OpenCV单词轮廓检测 0. 前言1. 策略分析2. 检测字符轮廓3. 检测单词轮廓相关链接 0. 前言 在根据文档图像执行单词转录时&#xff0c;通常第一步是识别图像中单词的位置。我们可以使用两种不同的方法识别图像中的单词&#xff1a; 使用 CRAFT、EAST 等深度学习技术使用基于 O…

C++中的解释器模式

目录 解释器模式&#xff08;Interpreter Pattern&#xff09; 实际应用 算术表达式解释器 布尔表达式解释器 总结 解释器模式&#xff08;Interpreter Pattern&#xff09; 解释器模式是一种行为设计模式&#xff0c;它定义了一种语言的文法表示&#xff0c;并使用解释器…

【Python入门与进阶】Python面向对象编程练习

练习题 1&#xff1a;定义一个 Person 类 定义一个 Person 类&#xff0c;它有以下属性和方法&#xff1a; 属性&#xff1a; name&#xff08;字符串&#xff09;&#xff1a;表示人的名字。age&#xff08;整数&#xff09;&#xff1a;表示人的年龄。 方法&#xff1a; __…

用Python处理Excel的资源

用Python处理Excel的资源 python-excel 读写Excel文件 openpyxl openpyx文档l 读写Excel2010文件&#xff08;即xlsx&#xff09; openpyxl示例&#xff1a; from openpyxl import Workbook wb Workbook()# 获取active worksheet ws wb.active# 给单元格赋值 ws[A1] 4…

代码随想录算法训练营第二十六天

题目&#xff1a;455. 分发饼干 贪心第一题 这里的局部最优就是大饼干喂给胃口大的&#xff0c;充分利用饼干尺寸喂饱一个&#xff0c;全局最优就是喂饱尽可能多的小孩。或者小饼干先喂饱小胃口 首先要对 g 和 s进行排序这样才能知道最大的胃口和最大的饼干然后进行遍历即可…

I/O Stream设计实验

实验要求和目的 深入理解java输入输出流相关类的基本用法&#xff0c;并且可以掌握Java程序的编写和调试。 实验环境 Java语言&#xff0c;PC或android平台 实验具体内容 设计和编写以下程序&#xff1a; 程序1&#xff1a; 从键盘读入多行字符串&#xff08;英文&#xf…

(第32天) 513、找树左下角的值 112、路径总和 113、路径总和II

目录 513、找树左下角的值题目描述思路代码112、路径总和题目描述思路代码113、路径总和II题目描述思路代码思考总结513、找树左下角的值 题目描述 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 思路 题目分析:…

ElasticSearch是什么?有哪些应用?有哪些优缺点?

ElasticSearch是什么&#xff1f;有哪些应用&#xff1f;有哪些优缺点&#xff1f; Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;设计用于实时、大规模数据的搜索和分析。它基于Apache Lucene构建&#xff0c;但通过提供一套简单易用的RESTful API、分布式特性…

Web前端接口探秘:深入解析四大方面、五大维度、六大关键及七大实践

Web前端接口探秘&#xff1a;深入解析四大方面、五大维度、六大关键及七大实践 在Web前端开发的广阔领域中&#xff0c;接口作为连接前后端的关键桥梁&#xff0c;扮演着至关重要的角色。本文将带领读者一同深入探索Web前端接口的四大方面、五大维度、六大关键及七大实践&…

Go语言中的函数项模式

函数项模式&#xff08;Functional Options Pattern&#xff09;是一种创造性的设计模式&#xff0c;允许使用接受零个或多个函数作为参数的可变构造函数来构建复杂结构 在没有函数项模式之前&#xff0c;在包初始化加载配置选项的时候&#xff0c;一般有两种做法 编写不同的构…

【微信小程序 事件绑定】

事件绑定 条件渲染 1. block包裹性容器&#xff1a;条件成立渲染 <block wx:if"{{ true }}"><block wx:if"{{true}}"><view>view1</view><view>view2</view> </block>2. wx:if&#xff1a;动态创建移除元素控…

农情监测系统的工作原理

TH-Q3农情监测系统是指利用现代信息技术手段&#xff0c;对农田环境进行实时监测、数据采集、传输和处理&#xff0c;以实现对农田环境的全面感知和智能管理[1]。该系统通过安装各种传感器和监测设备&#xff0c;能够实时监测农田的气象、土壤、植被和其他相关数据&#xff0c;…

VXLAN技术揭秘:实现大规模网络隔离与虚拟机无缝迁移

VXLAN简介 定义 VXLAN&#xff08;Virtual eXtensible Local Area Network&#xff0c;虚拟扩展局域网&#xff09;是由RFC定义的一种VLAN扩展方案。VXLAN采用MAC in UDP&#xff08;User Datagram Protocol&#xff09;封装方式&#xff0c;是NVO3&#xff08;Network Virtu…