一. 继承的概念与定义:怎么让类 “复用” 代码?

先想一个场景:Student 和 Teacher 都需要 “姓名、地址、身份认证”,但 Student 有学号、Teacher 有职称。如果各自写一遍,代码会很冗余 —— 继承就是把 “公共部分” 抽成父类(基类),子类(派生类)直接复用。

本篇博客代码示例中所需头文件

代码语言:javascript

AI代码解释

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<list>
using namespace std;

代码仓库

1.1 继承的核心概念
  • 父类(基类):存放公共成员的类,比如Person类(包含姓名、地址、identity身份认证函数)。
  • 子类(派生类):继承父类并扩展专属成员的类,比如Student(加学号)、Teacher(加职称)。
  • 本质:子类是父类的 “扩展”,能直接用父类的公共 / 保护成员,不用重复定义。

在这里插入图片描述

在这里插入图片描述

1.2 继承的定义格式

关键是 “继承方式 + 父类名”,比如 class Student : public Person。注意两点:

  • class默认私有继承,struct默认公有继承,推荐显式写继承方式(比如public)。
  • 继承方式会影响父类成员在子类中的访问权限(后面会讲)。

在这里插入图片描述

在这里插入图片描述

有了上面的知识储备后,我们来看一段代码示例来加深理解(注意看注释)

代码语言:javascript

AI代码解释

//基类/父类
class Person
{
// 公共成员:子类和类外都能访问
public:
	//进入校园/图书馆/实验室刷二维码等身份认证
	void identity()
	{
		cout << "void identity():" << _name << endl;
	}
	void func()
	{
		cout << _age << endl;
	}

// 保护成员:子类能访问,类外不能访问(专门为继承设计)
protected:
	string _name = "赵四";//姓名
	string _address;//地址
	string _tel;//电话

// 私有成员:子类和类外都不能直接访问(像“爸爸的私房钱”)
private:
	int _age = 18;//年龄
};

// 子类Student:公有继承Person
//class的话不写默认是私有继承,struct是公有继承
// class Student:Person
class Student : public Person
{
public:
	//学习
	void study()
	{
		//……
		//基类私有成员(爸爸的私房钱),派生类	中不可见,语法限制上不能直接使用
		//cout << _age << endl;
		
		//父类公有函数能间接访问私有成员
		func();
	}
protected://在继承中保护用的比较多
	int _stuid;//学号
};

// 子类Teacher:公有继承Person
class Teacher : public Person
{
public:
	//授课
	void teaching()
	{
		//…………
	}
protected:
	string title;//职称
};

// 测试:子类能直接用父类的函数
int main()
{
	Student s;
	Teacher t;
	s.identity();// 用父类的identity,输出“赵四”
	s.study();// 用子类的study,调用父类的func,输出了18

	return 0;
}

在这里插入图片描述

在这里插入图片描述

1.3 继承方式与成员访问权限

父类成员在子类中的访问权限,取决于 “父类的访问限定符” 和 “继承方式”,核心规则是:访问权限 = 两者中更严格(可以理解为Min)的那个public > protected > private)。

我们用表格总结一下(重点记public继承,实际开发最常用):

父类成员类型

public继承(推荐)

protected继承

private继承

父类public成员

子类中为public

子类中为protected

子类中为private

父类protected成员

子类中为protected

子类中为protected

子类中为private

父类private成员

不可见(不可访问)

不可见(不可访问)

不可见(不可访问)

关键提醒

  • 父类private成员无论怎么继承都 “不可见”(但是实际上是存在的)—— 子类想访问,只能通过父类的公有函数(比如上面的func())。
  • protected是为继承设计的:既不让类外访问,又能让子类用。
  • 在实际运用中一般都还是 public 继承,几乎很少使用 protected/private 继承。也不提倡使用后两者,因为它们继承下来的成员实际中扩展维护性不强,受到的限制比公有继承多。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐