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

相关推荐
Grey Zeng9 小时前
Java SE 25新增特性
java·jdk·jdk新特性·jdk25
感哥9 小时前
C++ 多态
c++
雨白10 小时前
Java 线程通信基础:interrupt、wait 和 notifyAll 详解
android·java
架构师沉默14 小时前
设计多租户 SaaS 系统,如何做到数据隔离 & 资源配额?
java·后端·架构
Java中文社群16 小时前
重要:Java25正式发布(长期支持版)!
java·后端·面试
沐怡旸16 小时前
【底层机制】std::string 解决的痛点?是什么?怎么实现的?怎么正确用?
c++·面试
每天进步一点_JL17 小时前
JVM 类加载:双亲委派机制
java·后端
用户2986985301417 小时前
Java HTML 转 Word 完整指南
java·后端
渣哥17 小时前
原来公平锁和非公平锁差别这么大
java
渣哥17 小时前
99% 的人没搞懂:Semaphore 到底是干啥的?
java