1.1 继承的概念

在C++中,继承(Inheritance) 是面向对象程序设计中的一种机制,它允许程序员在已有类(即基类或父类)的基础上,扩展或修改功能,从而形成新的类(即派生类或子类)。这种机制能够复用已有的代码,并且通过层次化的类结构,展示了面向对象编程由简单到复杂的认知过程。

举个例子,假设有一个基类 Person,定义了基本的个人信息,如姓名和年龄。现在需要创建一个 Student 类,除了拥有基本的个人信息外,还需要增加学号。通过继承,Student 类可以复用 Person 类中的代码,而不必重新编写这些属性。

代码语言:javascript

AI代码解释

class Person {
public:
    void Print() {
        cout << "name:" << _name << endl;
        cout << "age:" << _age << endl;
    }

protected:
    string _name = "peter";  // 姓名
    int _age = 18;           // 年龄
};

// Student类继承自Person类
class Student : public Person {
protected:
    int _stuid;  // 学号
};

在以上代码中,Student 类继承了 Person 类的成员函数和成员变量,这意味着 Student 类中包含了 _name 和 _age 两个属性,以及 Print() 函数。通过继承,我们实现了代码的复用。

1.2 继承的定义

继承在 C++ 中的定义主要通过以下格式实现:

代码语言:javascript

AI代码解释

class 子类名 : 继承方式 基类名 {
    // 子类的成员
};

其中,继承方式 可以是 public、protected 或 private,它们决定了基类的成员在派生类中的访问权限。

  • public 继承:基类的 public 成员在派生类中保持 public,protected 成员保持 protected。
  • protected 继承:基类的 public 成员在派生类中变为 protected,protected 成员保持 protected。
  • private 继承:基类的 public 和 protected 成员在派生类中均变为 private。

具体示例如下:

代码语言:javascript

AI代码解释

class Teacher : public Person {
protected:
    int _jobid;  // 工号
};

int main() {
    Student s;
    Teacher t;
    s.Print();
    t.Print();
    return 0;
}

在这个示例中,Student 和 Teacher 都继承了 Person 类的 Print() 函数,通过 s.Print() 和 t.Print() 可以分别输出 Student 和 Teacher 对象的姓名和年龄。

二. 继承中的访问权限

2.1 基类成员在派生类中的访问权限

基类的 public、protected 和 private 成员在派生类中的访问权限取决于继承方式。下面是不同继承方式下的访问权限表:

在这里插入图片描述

在这里插入图片描述从表中可以看出,基类的 private 成员在派生类中始终不可见(不可访问),无论采用何种继承方式。然而,基类的 protected 成员和 public 成员则根据继承方式在派生类中具有不同的访问级别。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐