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

🎬 博客主页:博主链接

🎥 本文由 M malloc 原创,首发于 CSDN🙉

🎄 学习专栏推荐:LeetCode刷题集 数据库专栏 初阶数据结构

🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

📆 未来很长,值得我们全力奔赴更美好的生活✨


文章目录

😇本章详情

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

😇继承的前情介绍

📝继承的概念(inheritance)

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

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


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

cpp 复制代码
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类中的成员变量,就不需要重复定义了。

cpp 复制代码
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继承的派⽣类对象 可以赋值给 基类的指针 / 基类的引⽤。这⾥有个形象的说法叫切⽚或者切割。寓意把派⽣类中基类那部分切出来,基类指针或引⽤指向的是派⽣类中切出来的基类那部分。

注意
基类对象不能复制给派生类对象

我们上代码来看一下吧

输入

cpp 复制代码
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希望可以帮助到你们噢,最后别忘记三连啦!!

相关推荐
Zhichao_972 小时前
【UE5 C++课程系列笔记】32——读Json文件并解析
c++·ue5
Mryan20052 小时前
解决GraalVM Native Maven Plugin错误:JAVA_HOME未指向GraalVM Distribution
java·开发语言·spring boot·maven
VX_CXsjNo12 小时前
免费送源码:Java+SSM+Android Studio 基于Android Studio游戏搜索app的设计与实现 计算机毕业设计原创定制
java·spring boot·spring·游戏·eclipse·android studio·android-studio
ylfhpy2 小时前
Java面试黄金宝典33
java·开发语言·数据结构·面试·职场和发展·排序算法
点云SLAM2 小时前
C++20新增内容
c++·算法·c++20·c++ 标准库
照书抄代码2 小时前
C++11可变参数模板单例模式
开发语言·c++·单例模式·c++11
No0d1es2 小时前
CCF GESP C++编程 四级认证真题 2025年3月
开发语言·c++·青少年编程·gesp·ccf·四级·202503
乘风!3 小时前
Java导出excel,表格插入pdf附件,以及实现过程中遇见的坑
java·pdf·excel
小小鸭程序员3 小时前
Vue组件化开发深度解析:Element UI与Ant Design Vue对比实践
java·vue.js·spring·ui·elementui
No0d1es3 小时前
CCF GESP C++编程 五级认证真题 2025年3月
开发语言·c++·青少年编程·gesp·ccf·五级·2025年3月