一、继承核心概念
1. 为什么需要继承?
重复代码过多、类与类之间功能高度相似,重复编写冗余。继承作用:
- 代码复用:子类直接拥有父类所有成员
- 层级设计:抽象公共父类,扩展独有子类
- 多态基础:为后续多态、项目架构铺路
2. 父子类关系
- 父类(基类):抽取公共属性与行为
- 子类(派生类):继承父类,扩展自有功能
通俗举例:动物(父类)→ 狗、猫、鸟(子类)学生(父类)→ 小学生、大学生(子类)
二、继承基础语法
cpp
运行
class 子类名 : 继承方式 父类名 { // 子类独有成员 };三种继承方式:
public公有继承(开发最常用)protected保护继承private私有继承
三、公有继承 public(重点掌握)
规则
- 父类
public→ 子类public - 父类
protected→ 子类protected - 父类
private→ 子类不可见、无法访问
基础示例
#include <iostream> #include <string> using namespace std; // 父类 class Person { public: string name; protected: int age; private: int id; public: void showBase() { cout << "姓名:" << name << endl; } }; // 公有继承 class Student : public Person { public: double score; // 子类独有方法 void study() { cout << "学生正在学习" << endl; // age 受保护,子类可访问 cout << "年龄:" << age << endl; // id 私有,子类无法访问 // cout << id; // 报错 } };使用
int main() { Student s; // 继承父类公有成员 s.name = "小明"; s.showBase(); // 子类自有成员 s.score = 95; s.study(); return 0; }四、三种继承方式权限总表(必背)
表格
| 父类成员 | public 继承 | protected 继承 | private 继承 |
|---|---|---|---|
| public | public | protected | private |
| protected | protected | protected | private |
| private | 不可访问 | 不可访问 | 不可访问 |
工程开发只使用 public 继承,另外两种极少用。
五、父子类 构造与析构顺序
核心规则
- 构造顺序:先父类构造 → 后子类构造
- 析构顺序:先子类析构 → 后父类析构
原理:子类依赖父类资源,必须先搭建父类基础,再扩展子类;销毁反向执行。
代码演示
class Person { public: Person(){ cout << "父类构造" << endl; } ~Person(){ cout << "父类析构" << endl; } }; class Student : public Person { public: Student(){ cout << "子类构造" << endl; } ~Student(){ cout << "子类析构" << endl; } }; int main() { Student s; return 0; }输出:
父类构造 子类构造 子类析构 父类析构六、子类调用父类有参构造
子类无法继承构造函数,必须手动指定调用父类构造语法:
子类构造(参数) : 父类构造(实参) { }示例:
Person(string n) { name = n; } Student(string n, double s) : Person(n) { score = s; }七、同名成员隐藏(继承坑点)
子类与父类出现同名成员变量 / 函数:
- 子类成员隐藏父类成员
- 默认优先访问子类自身
- 强制访问父类:
父类名::成员
// 访问父类同名函数 s.Person::showBase();八、继承分类(了解)
- 单继承:一个子类只继承一个父类(常用)
- 多继承:一个子类继承多个父类(复杂项目偶尔用)
- 多层继承:A→B→C 链式继承
九、高频易错点
- 误以为 private 成员子类可以继承访问
- 忽略构造析构顺序,导致资源错乱
- 子类有参构造不主动调用父类有参构造
- 滥用私有 / 保护继承,破坏代码可读性
- 同名成员不区分作用域,引发逻辑覆盖
十、今日核心总结
- 继承目的:代码复用、层级抽象
- 日常开发统一使用public 公有继承
- 父类私有成员永远无法被子类访问
- 构造:先父后子;析构:先子后父
- 同名成员会隐藏,可通过
类名::强制访问父类