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 继承。注意,使用 class 关键字时默认继承方式是 private,而 struct 默认为 public。
基于继承实现栈容器
利用继承关系,我们可以轻松实现基于不同底层容器的栈(Stack)。例如,继承自 std::vector。
模板实例化与作用域解析
当基类是类模板时,派生类成员函数中调用基类成员需要注意作用域。如果在 push 函数中不指定类域,编译器可能无法找到 push_back,因为模板需要按需实例化。
#include <vector>
using namespace std;
Keda {
< >
: std::vector<T> {
:
{
vector<T>::(x);
}
{
vector<T>::();
}
{
vector<T>::();
}
{
vector<T>::();
}
};
}
{
Keda::stack<> st;
st.();
st.();
(!st.()) {
cout << st.() << ;
st.();
}
;
}


