C++ 继承机制详解
面向对象编程的三大特性中,封装我们已经熟悉,接下来深入探讨继承。继承允许我们复用代码并建立类之间的层次关系。本文将通过实际案例讲解继承的定义、访问控制、作用域规则以及派生类的默认成员函数行为。
继承的基本定义与访问权限
假设大学里有学生和教师,作为人都有姓名、住址和电话,但教师有职称,学生有学号。我们可以将共性封装在基类 Person 中,差异封装在子类 Student 和 Teacher 中。
class Person {
public:
// 身份认证
void identity() {
cout << "void identity()" << _name << endl;
}
protected:
string _name = "张三";
string _address;
string _tel;
private:
int _age = 18;
};
class Student : public Person {
public:
void study() { /* ... */ }
protected:
int _stuid;
};
访问权限规则
- 私有成员不可见:父类的
private成员虽然被继承到了子类对象中(占用内存),但在语法上子类无法直接访问。这属于权限限制,而非未继承。 - 保护成员的作用:如果希望成员在类外不可见,但在子类中可见,应使用
protected。这是为继承场景专门设计的限定符。 - 总结:父类私有成员在子类中不可见。其他成员的访问权限取决于
Min(父类访问限定符,继承方式),即public > protected > private。 - 默认继承方式:使用
class关键字时默认为private继承;使用struct时默认为public继承。实践中通常使用public继承。
利用继承实现栈结构
之前我们用容器适配器实现了栈,这里尝试用继承的方式。当我们在派生类模板中使用基类模板的成员时,需要注意显式指定命名空间或类域。
如果在 push 函数中不指定类域,编译器可能找不到 push_back,因为模板需要按需实例化。例如:


