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

前言:

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

目录

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

二、继承的基本概念

[2.1 继承的定义](#2.1 继承的定义)

[2.2 继承关系和访问限定符](#2.2 继承关系和访问限定符)

[2.3 继承方式所带来的权限问题](#2.3 继承方式所带来的权限问题)

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

四、总结


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

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

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

不用继承:

cpp 复制代码
#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;
}

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

继承:

cpp 复制代码
#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 继承方式所带来的权限问题

描述:

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

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

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

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

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

如图所示:

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

cpp 复制代码
#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++继承的一些知识,由于我们近期考试周的缘故,暂时就先写这么多了,下一篇我们将详细地介绍继承中一些更难的问题,比如多继承,菱形继承等问题,今天的文章就先到这了,感谢观看

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

相关推荐
敲上瘾11 分钟前
操作系统的理解
linux·运维·服务器·c++·大模型·操作系统·aigc
不会写代码的ys17 分钟前
【类与对象】--对象之舞,类之华章,共绘C++之美
c++
兵哥工控19 分钟前
MFC工控项目实例三十二模拟量校正值添加修改删除
c++·mfc
在下不上天19 分钟前
Flume日志采集系统的部署,实现flume负载均衡,flume故障恢复
大数据·开发语言·python
EterNity_TiMe_28 分钟前
【论文复现】(CLIP)文本也能和图像配对
python·学习·算法·性能优化·数据分析·clip
长弓聊编程29 分钟前
Linux系统使用valgrind分析C++程序内存资源使用情况
linux·c++
sanguine__31 分钟前
java学习-集合
学习
lxlyhwl31 分钟前
【STK学习】part2-星座-目标可见性与覆盖性分析
学习
nbsaas-boot32 分钟前
如何利用ChatGPT加速开发与学习:以BPMN编辑器为例
学习·chatgpt·编辑器
陌小呆^O^33 分钟前
Cmakelist.txt之win-c-udp-client
c语言·开发语言·udp