继承基础
更新时间:2026-08-27。本文是
languages/cpp/主题入门层第 26 篇,继承与多态子族开篇(存量class-object拆解迁入)。继承让一个新类站在已有类的肩膀上:Circle是Shape的一种,自动拥有Shape的成员。本篇讲清继承语法、三种继承方式,以及继承如何与访问控制配合。
本文要回答的问题
- 继承的语法是什么?
Circle : public Shape的public是什么? - 派生类能用基类的哪些成员?
- 继承和"组合"怎么选?
一、继承:新类站在老类肩上
class Shape { // 基类(父类)
protected:
double area_ = 0;
public:
double area() const { return area_; }
};
class Circle : public Shape { // 派生类(子类):Circle 继承 Shape
double radius_;
public:
Circle(double r) : radius_(r) {
area_ = 3.14159 * r * r; // 能访问基类的 protected 成员
}
};class Circle : public Shape 读作"Circle 公有继承 Shape"。继承后:
Circle自动拥有Shape的成员(area_、area()),不用重写;Circle可以加自己的成员(radius_)和函数;Circle是Shape的一种——is-a 关系:Circle 就是 Shape。
面向对象术语:被继承的叫基类/父类(base class),继承的叫派生类/子类(derived class)。
二、三种继承方式:public / protected / private
冒号后面那个关键字决定基类成员在派生类里的"降级程度":
| 继承方式 | 基类 public | 基类 protected | 基类 private |
|---|---|---|---|
: public | 仍 public | 仍 protected | 不可访问 |
: protected | 降为 protected | 仍 protected | 不可访问 |
: private | 降为 private | 降为 private | 不可访问 |
三条规律:
private基类成员谁都继承不到(第 17 篇说过,只能本类 + 友元用);public继承不降级,protected/private继承逐级降;- 日常 99% 用
public继承——protected/private继承是"实现复用"的冷门工具(高手层再讲)。
记不住表格没关系,记住结论:写 : public Base 就对了。
三、派生类能碰哪些成员
class Base {
private:
int priv_;
protected:
int prot_;
public:
int pub_;
};
class Derived : public Base {
void f() {
// priv_ = 1; // 错误:Base 的 private,Derived 也碰不得
prot_ = 2; // 合法:protected 是给子类留的后门
pub_ = 3; // 合法
}
};关键认知:protected 的意义就在这——"本类 + 派生类"能访问。基类想给子类留"后门成员"就用 protected,想完全封锁用 private。上一篇文章访问控制讲过的三档,在继承场景下 protected 才真正发挥价值。
四、继承 vs 组合
继承不是万能的,很多"复用"用组合更合理:
// 继承:is-a
class Car : public Vehicle { ... }; // 车是一种交通工具
// 组合:has-a
class Car {
Engine engine_; // 车拥有一个引擎
std::vector<Wheel> wheels_;
};| 继承(is-a) | 组合(has-a) | |
|---|---|---|
| 关系 | 子类是一种基类 | 类拥有成员对象 |
| 复用 | 继承基类的接口和实现 | 调用成员对象的接口 |
| 耦合 | 强(基类改动影响全部子类) | 弱(成员可以换) |
| 适用 | 真的共享类型层级 | 只是"用到某个类的能力" |
经验法则:能用组合就组合,真的需要多态才继承。初学者容易一上来就继承("我也想复用那个类"),结果把两个不相干的类绑死。先把 is-a / has-a 想清楚再动手。
五、和 C 对比
| 对比项 | C | C++ |
|---|---|---|
| 类型复用 | 结构体嵌套(组合) | 继承 + 组合 |
| is-a 关系 | 无语言支持 | 继承语法 |
| 代码复用 | 手动复制或函数指针 | 继承成员自动带入 |
| 类型层级 | 无 | 基类/派生类 |
C 里想要"Circle 也是 Shape",只能结构体嵌套(struct Circle { struct Shape base; ... })或复制代码。C++ 的继承是语言级支持:成员自动带入、类型自动兼容(Circle* 可当 Shape* 用,下一篇多态的根基)。
六、与本站主线衔接
- 派生类的构造/析构顺序,见 派生类构造与析构顺序;
- 多态的关键:基类指针调派生类实现,见 虚函数与多态;
- 继承后对象的内存布局(基类成员在前、派生类成员在后),见专家层对象内存布局。
一句话总结
继承用 class Circle : public Base 让派生类自动拥有基类的成员,日常一律写 public 继承;protected 是给子类留的后门,private 基类成员子类也碰不得;继承表达 is-a 关系、组合表达 has-a 关系,能用组合就组合,需要多态才继承。
上一篇:const 成员函数 下一篇:派生类构造与析构顺序