C++ 继承机制详解
面向对象编程的三大特性之一是继承。封装屏蔽了底层细节,而继承则建立了类之间的层次关系。今天我们来深入聊聊继承在 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;
};
class Teacher : public Person {
public:
void teaching() { /* ... */ }
protected:
string title;
};
这里有几个关键点需要注意:
- 私有成员的可见性:父类的
private成员在子类中是不可见的。但这并不意味着它们没有被继承。实际上,它们存在于子类对象内存中,只是语法上禁止直接访问。如果尝试在子类中访问_age,编译器会报错。 - 保护成员的作用:如果希望成员在类外不可见,但在子类中可访问,应使用
protected。这个限定符正是为了继承场景设计的。 - 有效访问权限:总结来说,父类成员在子类的访问方式取决于
Min(成员在父类的访问限定符,继承方式)。即 。


