📜  C++中的继承(1)

📅  最后修改于: 2023-12-03 15:14:03.841000             🧑  作者: Mango

C++中的继承

在C++中,继承是面向对象编程的核心概念之一。继承是指一个对象(称之为子类)可以从另一个对象(称之为超类或父类)继承属性和方法。子类可以增加或修改继承来的属性和方法,从而实现代码的重用和扩展性。

继承的类型

在C++中,继承有三种类型:公有继承、私有继承和保护继承。

公有继承

公有继承是指子类继承父类的公共成员变量和公共成员函数。公共成员可以被子类对象和子类的成员函数直接访问。公有继承的语法如下:

class ChildClass : public ParentClass {
    // 子类的其他成员变量和成员函数
};
私有继承

私有继承是指子类继承父类的私有成员变量和私有成员函数。私有成员只能在父类中访问,子类对象和子类的成员函数都不能直接访问。私有继承的语法如下:

class ChildClass : private ParentClass {
    // 子类的其他成员变量和成员函数
};
保护继承

保护继承是指子类继承父类的保护成员变量和保护成员函数。保护成员只能在父类和子类中访问,不能在其他地方访问。保护继承的语法如下:

class ChildClass : protected ParentClass {
    // 子类的其他成员变量和成员函数
};
继承的特点
  1. 继承可以节省编写代码的时间和精力,因为子类可以重用父类的代码。
  2. 继承可以提高代码的可维护性,因为修改父类的代码会影响所有子类的行为。
  3. 继承可以提高代码的灵活性,因为子类可以根据需要重载继承来的函数,或者增加新的函数。
  4. 继承可以实现面向对象编程的多态性特点,因为子类可以覆盖继承来的虚函数,从而实现不同子类对同一个函数的不同行为。
继承的示例
#include <iostream>
using namespace std;

// 基类
class Person {
public:
    string name;
    int age;
    virtual void introduce() {
        cout << "My name is " << name << ", and I am " << age << " years old." << endl;
    }
};

// 子类1,公有继承
class Student : public Person {
public:
    string school;
    void introduce() {
        cout << "I am a student from " << school << "." << endl;
    }
};

// 子类2,私有继承
class Employee : private Person {
public:
    string company;
    void introduce() {
        cout << "I work for " << company << " company." << endl;
    }
};

// 子类3,保护继承
class Teacher : protected Person {
public:
    string subject;
    void introduce() {
        cout << "I teach " << subject << " subject." << endl;
    }
};

int main() {
    // 创建基类对象
    Person person;
    person.name = "Tom";
    person.age = 20;
    person.introduce();  // "My name is Tom, and I am 20 years old."

    // 创建公有继承子类对象
    Student student;
    student.name = "Alice";
    student.age = 18;
    student.school = "Harvard";
    student.introduce();  // "I am a student from Harvard."

    // 创建私有继承子类对象
    Employee employee;
    employee.name = "Bob";
    employee.age = 30;
    employee.company = "Apple";
    // employee.introduce();  // 编译错误,不能访问父类的公共成员

    // 创建保护继承子类对象
    Teacher teacher;
    teacher.name = "Cathy";
    teacher.age = 40;
    teacher.subject = "Math";
    // teacher.introduce();  // 编译错误,不能访问父类的公共成员

    return 0;
}

在上述示例中:

  1. Person类是基类,Student、Employee和Teacher类是Person类的子类。
  2. Student类公有继承Person类,Employee类私有继承Person类,Teacher类保护继承Person类。
  3. Student类、Employee类和Teacher类都覆盖了introduce()虚函数,实现了不同的行为。
  4. 在main函数中,创建了Person类、Student类、Employee类和Teacher类的对象,演示了继承的特点和用法。