当前位置: 首页 > news >正文

【C++奇遇记】C++中的进阶知识(继承(一))

🎬 博客主页:博主链接
🎥 本文由 M malloc 原创,首发于 CSDN🙉
🎄 学习专栏推荐:LeetCode刷题集 数据库专栏 初阶数据结构
🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📆 未来很长,值得我们全力奔赴更美好的生活✨

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

文章目录

  • 😇本章详情
  • 😇继承的前情介绍
    • 📝继承的概念(inheritance)
    • 📝继承出现前后发生的变化
  • 😇继承定义
    • 📝定义格式
  • ✉基类和派生类间的转换
    • 📋切片或切割
  • 📃如何巩固学习
  • 📃本文小结

😇本章详情

🐤本篇文章将讲授C++的继承相关的知识

😇继承的前情介绍

📝继承的概念(inheritance)

😁继承(inheritance)机制是⾯向对象程序设计使代码可以复⽤的最重要的⼿段,它允许我们在保持原有类特性的基础上进⾏扩展,增加⽅法(成员函数)和属性(成员变量),这样产⽣新的类,称派⽣类。继承呈现了⾯向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的函数层次的复⽤,继承是类设计层次的复⽤。

📝继承出现前后发生的变化


继承出现前。举例说明:在继承没出现前我们设计两个类Student和Teacher类,代码如下所示

class Student
{
public:
	// 进⼊校园/图书馆/实验室刷⼆维码等⾝份认证
	void identity()
	{
	// ...
	}
	// 学习
	void study()
	{
	// ...
	}
protected:
	string _name = "peter"; // 姓名
	string _address; // 地址
	string _tel; // 电话
	int _age = 18; // 年龄
	int _stuid; // 学号
};
class Teacher
{
public:
	// 进⼊校园/图书馆/实验室刷⼆维码等⾝份认证
	void identity()
	{
	// ...
	}
	// 授课
	void teaching()
	{
	//...
	}
protected:
	string _name = "张三"; // 姓名
	int _age = 18; // 年龄
	string _address; // 地址
	string _tel; // 电话
	string _title; // 职称
};
int main()
{
	return 0;
}

看到上述代码,我们会发现Student和Teacher类中的保护域当中的成员变量有很多都是冗余的,并且都有identity的成员函数,当然了其中也有各自没有的成员的变量和成员函数。


那我们现在想解决这部分冗余的代码,那么我们该如何处理呢?于是继承应运而生

继承出现后,我们就可以定义一个公共的成员Person类中,Student和Teacher都继承Person,派生类Student和Teacher都可以继承基类Person类中的成员变量,就不需要重复定义了。

class Person
{
public:
	// 进⼊校园/图书馆/实验室刷⼆维码等⾝份认证
	void identity()
	{
		cout << "void identity()" << _name << endl;
	}
protected:
	string _name = "张三"; // 姓名
	string _address; // 地址
	string _tel; // 电话
	int _age = 18; // 年龄
};
class Student : public Person
{
public:
	// 学习
	void study()
	{
		// ...
	}
protected:
	int _stuid; // 学号
};
class Teacher : public Person
{
public:
	// 授课
	void teaching()
	{
		//...
	}
protected:
	string title; // 职称
};
int main()
{
	Student s;
	Teacher t;
	s.identity();
	t.identity();
	return 0;
}

观察上述代码,可以发现,派生类Student和Teacher类中并没有_name,_address这些成员变量,也没有identity这个成员函数,但是我们在main函数中,实例化了一个学生对象s和老师对象t,我们可以发现他居然可以调用Person类中的成员函数identity。


通过上述的小例子,是否已经对继承有了初步的认识了呢?接下来我们进入对继承正式的认识吧!

😇继承定义

📝定义格式

观察下图

在这里插入图片描述

观察上图我们可以知道,Person就是基类,也就是父类。Student是派生类,也称为子类


关于继承的一些小tips

  1. 使⽤关键字class时默认的继承⽅式是private,使⽤struct时默认的继承⽅式是public,不过最好显示的写出继承⽅式。
  2. 在实际运⽤中⼀般使⽤都是public继承,⼏乎很少使⽤protected/private继承,也不提倡使⽤protected/private继承,因为protected/private继承下来的成员都只能在派⽣类的类⾥⾯使⽤,实际中扩展维护性不强。

✉基类和派生类间的转换

📋切片或切割

💐public继承的派⽣类对象 可以赋值给 基类的指针 / 基类的引⽤。这⾥有个形象的说法叫切⽚或者切割。寓意把派⽣类中基类那部分切出来,基类指针或引⽤指向的是派⽣类中切出来的基类那部分。

注意
基类对象不能复制给派生类对象
在这里插入图片描述

我们上代码来看一下吧

输入

class Person
{
protected :
	string _name; // 姓名
	string _sex; // 性别
	int _age; // 年龄
};
class Student : public Person
{
public :
	int _No ; // 学号
};
int main()
{
	Student sobj ;
	// 1.派⽣类对象可以赋值给基类的指针/引⽤
	Person* pp = &sobj;
	Person& rp = sobj;
	// ⽣类对象可以赋值给基类的对象是通过调⽤后⾯会讲解的基类的拷⻉构造完成的
	Person pobj = sobj;
	//2.基类对象不能赋值给派⽣类对象,这⾥会编译报错
	sobj = pobj;
	return 0;
}

注意

派生类Student中继承了基类中的成员变量,于是我们用派生类对基类进行赋值,此时进行的就是切片。把派生类中继承基类的部分切片赋值给基类中的成员变量。

📃如何巩固学习

提示:在学习的过程中,我们需要先自行进行思考,并且多去阅读一些大佬的书籍,俗话说的好,书籍是人类进步的阶梯!

📃本文小结

  1. 这只是继承中的一小部分知识,山高路远,我们下期再见啦!!!!

好啦今日的分享到这里就结束啦,我是爱你们的M malloc希望可以帮助到你们噢,最后别忘记三连啦!!

在这里插入图片描述

在这里插入图片描述

相关文章:

  • 土地流转网站开发晋江怎么交换友情链接
  • 黑龙江省住房和建设厅网站搜索引擎优化seo怎么做
  • 咸阳机场建设招聘信息网站免费b站推广短视频
  • 南磨房做网站公司百度推广账户登录
  • 网站排名优化有哪些牛霸天的软件1seo网络推广是干嘛的
  • 酒店网站建设策划书怎么写关键词搜索推广
  • Visual FoxPro 6.0学习笔记十五
  • 定制一款国密浏览器(1):Chromium 源码获取和构建
  • 常见前端GET请求以及对应的Spring后端接收接口写法
  • Docker快速安装MongoDB并配置主从同步
  • WiFi加密协议
  • RoMo: Robust Motion Segmentation Improves Structure from Motion
  • 【c语言】结构体
  • [自制调试工具]构建高效调试利器:Debugger 类详解
  • at定时任务(超详细)
  • SpringBoot整合JUnit
  • [ctfshow web入门] web1
  • 【学习笔记】深度学习环境部署相关
  • 提高MCU的效率方法
  • Redis常见命令
  • 反向查询详解以Django为例
  • 速解!Cadence SPB24.1 ORCAD 开始页空白难题
  • Chapter06_图像复原
  • Transformer与注意力机制详解
  • Unity:Colliders(碰撞体) Rigidbody(刚体)
  • 解锁健康密码,拥抱品质生活