在c++面向对象编程(OOP)中,继承(Inheritance) 是最核心、也最容易被初学者误解的概念之一。它不仅影响代码的复用方式,也直接关系到系统的可维护性和扩展性。

本文将从概念、语法、特点、优缺点、使用场景和最佳实践几个方面,系统地介绍类的继承。

一、什么是类的继承

继承是指:

一个类(子类)可以复用另一个类(父类)的属性和方法,并在此基础上进行扩展或重写。

例如,学生是人,狗是动物;如果我们想要描述很多人,每个人都有胳膊,腿等,如果我们对每个人都写一遍这些"胳膊",“腿"等内容,无疑会增加很多无关代码量,所以我们可以把所有人共有的特性写一个父类叫做"人”,其余的每个人都继承这个父类就可以了,只需要再写自身单独的特性。

继承的核心价值体现在三点:

1️⃣ 代码复用

将公共逻辑放到父类中,子类直接使用,减少重复代码。

2️⃣ 逻辑抽象

通过父类抽象出"共性",子类只关注"个性"。

3️⃣ 多态的基础

继承是实现多态的前提,使程序具备更强的扩展能力。

下面我们实现上述例子:

父类中只放所有人共有的特性,比如胳膊、腿,以及通用行为。

#include <iostream>
#include <string>
using namespace std;
// 父类:人 class Person
{ public:
    int arms; // 胳膊
    int legs; // 腿
    Person()
    {
        arms = 2;
        legs = 2;
    }
    void eat() { cout << "人会吃饭" << endl; }
    void walk() { cout << "人会走路" << endl; }
};

定义子类:学生(Student)

学生 是一个人,所以使用 public 继承,只写学生独有的特性和行为

// 子类:学生
class Student : public Person
{ public:
    string school;
    Student(string s)
    {
     school = s;
    }
    void study()
    {
        cout << "学生在学习,学校是:" << school << endl;
    }
};

定义另一个子类:老师(Teacher)

同样继承Person,但有不同的特性。

// 子类:老师
class Teacher : public Person
{
public:
    string subject;
    Teacher(string sub)
    {
        subject = sub;
    }
    void teach()
    {
        cout << "老师在教:" << subject << endl;
    }
};

二、类的继承方式

在 C++ 中,继承方式决定了:

父类成员在子类中的访问权限

很多初学者在学继承时会混淆:

  • 父类自身的 public / protected / private

  • 子类继承时的 public / protected / private

每个类的自身成员权限有三种,public,protected,private,继承方式也有三种public,protected,private,继承方式决定了子类可不可以访问父类的成员。

2.1 public继承

1️⃣ 规则

class Student : public Person
父类成员 子类中变成
public public
protected protected
private 不可访问

2️⃣ 示例

class Person {
public:
    int age;
protected:
    string name;
private:
    int id;
};

class Student : public Person {
public:
    void show() {
        age = 18;     // OK
        name = "Tom"; // OK
        // id = 1;    // ERROR
    }
};

2.2 保护继承

1️⃣ 规则

class Student : protected Person
父类成员 子类中变成
public protected
protected protected
private 不可访问

2️⃣ 示例

class Student : protected Person {
public:
    void show() {
        age = 18;     // OK
        name = "Tom"; // OK
    }
};

int main() {
    Student s;
    // s.age = 18;   // ERROR(对外不可见)
}

2.3 私有继承

1️⃣ 规则

class Student : private Person
父类成员 子类中变成
public private
protected private
private 不可访问

2️⃣ 示例

class Student : private Person {
public:
    void show() {
        age = 18;     // OK
        name = "Tom"; // OK
    }
};

int main() {
    Student s;
    // s.age = 18;   // ERROR
}

总结

  • public 继承:权限不变

  • protected 继承:对外隐藏(权限全变protected)

  • private 继承:完全私有(权限全变private)

构造析构顺序:

继承中构造和析构的顺序:

   "父子子父":父类先构造------子类再构造------子类析构------父类析构

继承优缺点:继承的优点与缺点

✅ 优点

  • 提高代码复用率

  • 结构清晰,层次分明

  • 支持多态,便于扩展

❌ 缺点

  • 父类修改可能影响所有子类

  • 类之间耦合度高

  • 继承层次过深会增加理解成本

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐