C++ 继承入门:从基础概念到默认成员函数,吃透类复用的核心逻辑
一. 继承的概念与定义:怎么让类 “复用” 代码?
先想一个场景: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继承。也不提倡使用后两者,因为它们继承下来的成员实际中扩展维护性不强,受到的限制比公有继承多。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)