继承概述
继承(Inheritance)是面向对象编程中实现代码复用的核心手段。它允许我们在保留基类特性的基础上进行扩展,增加新的成员函数和属性,从而生成派生类。
想象一下,如果没有继承,Student 和 Teacher 类都需要定义姓名、年龄、电话等重复的成员变量和身份认证方法,设计会变得冗余且难以维护。通过引入 Person 基类,将公共部分提取出来,让 Student 和 Teacher 继承 Person,就能有效避免重复定义。
继承的定义与格式
在 C++ 中,Person 被称为基类(或父类),Student 和 Teacher 则是派生类(或子类)。

定义派生类时,使用冒号后跟访问修饰符来指定继承方式。例如:class Student : public Person。
成员访问权限的变化
继承方式会直接影响基类成员在派生类中的可见性和访问权限。下表总结了不同继承方式下的变化规律:
| 类成员 / 继承方式 | public 继承 | protected 继承 | private 继承 |
|---|---|---|---|
| 基类的 public 成员 | 派生类的 public 成员 | 派生类的 protected 成员 | 派生类的 private 成员 |
| 基类的 protected 成员 | 派生类的 protected 成员 | 派生类的 protected 成员 | 派生类的 private 成员 |
| 基类的 private 成员 | 在派生类中不可见 | 在派生类中不可见 | 在派生类中不可见 |
这里有几个关键点需要注意:
- 私有成员的不可见性:无论采用何种继承方式,基类的 private 成员在派生类中都是不可见的。它们虽然被继承到了派生类对象中,但语法上限制了无法直接访问。如果需要在派生类内部访问但不希望外部直接调用,应将其定义为 protected。
- 访问权限计算:基类其他成员在派生类中的访问权限,可以理解为
Min(基类访问限定符,继承方式)。即 public > protected > private。 - 默认继承方式:使用关键字
class时,默认继承方式是 private;使用struct时,默认是 public。为了代码清晰,建议显式写出继承方式。 - 实际建议:在实际开发中,public 继承最为常见,因为它保持了'是一个(is-a)'的关系。protected 和 private 继承通常用于实现特定的封装需求,但在一般业务逻辑中较少使用,因为它们的扩展性和维护性相对较弱。
模板与继承的实战
标准库中的 std::stack 就是一个典型的基于容器(如 vector)进行继承实现的例子。当基类也是模板时,需要注意作用域解析的问题。
#include <iostream>
#include <vector>
using namespace std;
< >
: vector<T> {
:
{
vector<T>::(x);
}
{
vector<T>::();
}
{
vector<T>::();
}
{
vector<T>::();
}
};
{
Stack<> st;
st.();
st.();
st.();
(!st.()) {
cout << st.() << ;
st.();
}
;
}



