继承是面向对象编程(OOP)中的一个核心特性,它允许一个类基于另一个类进行扩展和修改。通过继承,子类可以继承父类的属性和方法,从而实现代码的重用和系统的扩展。下面详细讲解继承的概念、种类、重要性以及在 C++ 中的实现。

一、继承的定义

继承是一个类(称为子类或派生类)可以获取另一个类(称为父类或基类)的属性和方法的机制。这种关系表示一种 "is-a" 关系,意味着子类是一种特定类型的父类。

二、继承的种类

  • 单继承: 一个子类只继承一个父类。
class Base { ... };  
class Derived : public Base { ... };
  • 多重继承: 一个子类可以继承多个父类。这种方式可能导致复杂性,例如“菱形继承”问题(Diamond Problem)。
class Base1 { ... };  
class Base2 { ... };  
class Derived : public Base1, public Base2 { ... };
  • 多级继承: 一个类继承自一个类,而这个类又继承自另一个类。
class Base { ... };  
class Intermediate : public Base { ... };  
class Derived : public Intermediate { ... };
  • 层次继承: 多个子类继承自同一个父类。
class Base { ... };  
class Derived1 : public Base { ... };  
class Derived2 : public Base { ... };

三、继承的重要性

  1. 代码重用: 继承允许子类重用父类的现有代码,减少代码冗余,提高开发效率。例如,如果多个类只需稍作修改即可在基类中实现,则可以通过继承来实现。
  2. 构建层次结构: 通过建立类的层次结构,可以组织代码,使其更易于管理和理解。例如,基类可以定义通用行为,而派生类可以实现特定功能。
  3. 实现多态性: 继承与多态结合可以使得程序设计更加灵活。例如,通过父类指针或引用,可以调用任何派生类的实现,从而允许不同对象以相同方式应对应的消息。
  4. 提高扩展性: 可以在不修改原有代码的情况下,添加新功能,仅需创建新类并继承相应的基类。

四、在 C++ 中实现继承

在 C++ 中,继承通过关键字 publicprotected 或 private 来实现。三者的区别是:

  • public 继承:基类的公有和保护成员在派生类中仍然为公有和保护。
  • protected 继承:基类的公有和保护成员在派生类中变为保护成员。
  • private 继承:基类的公有和保护成员在派生类中变为私有成员。

示例代码

以下是一个关于继承的示例,展示如何在 C++ 中实现单继承和多重继承。

#include <iostream>  
#include <string>  

// 基类  
class Vehicle {  
protected:  
    std::string brand;  

public:  
    Vehicle(const std::string& brand) : brand(brand) {} // 构造函数  

    void displayBrand() const {  
        std::cout << "Brand: " << brand << std::endl;  
    }  
};  

// 派生类  
class Car : public Vehicle {  
private:  
    int doors;  

public:  
    Car(const std::string& brand, int doors)   
        : Vehicle(brand), doors(doors) {} // 构造函数  

    void displayCarInfo() const {  
        displayBrand(); // 调用父类方法  
        std::cout << "Doors: " << doors << std::endl;  
    }  
};  

// 另一个基类  
class Electric {  
protected:  
    int batteryCapacity;  

public:  
    Electric(int batteryCapacity) : batteryCapacity(batteryCapacity) {} // 构造函数  
};  

// 多重继承的派生类  
class ElectricCar : public Car, public Electric {  
private:  
    std::string model;  

public:  
    ElectricCar(const std::string& brand, int doors, int batteryCapacity, const std::string& model)  
        : Car(brand, doors), Electric(batteryCapacity), model(model) {} // 构造函数  

    void displayElectricCarInfo() const {  
        displayCarInfo(); // 调用Car类中的方法  
        std::cout << "Battery Capacity: " << batteryCapacity << " kWh" << std::endl;  
        std::cout << "Model: " << model << std::endl;  
    }  
};  

int main() {  
    ElectricCar myElectricCar("Tesla", 4, 100, "Model S");  
    myElectricCar.displayElectricCarInfo(); // 显示电动车的信息  
    return 0;  
}

代码解析

  1. 基类 Vehicle:定义了一辆车的基本属性 brand 和一个显示品牌的成员函数 displayBrand
  2. 派生类 Car:从 Vehicle 继承,增加了一个私有成员 doors 以及一个显示车辆信息的方法 displayCarInfo,它调用了基类的方法。
  3. 另一个基类 Electric:定义了电动汽车的额外属性 batteryCapacity
  4. 多重继承的派生类 ElectricCar:同时继承了 Car 和 Electric,其构造函数初始化父类的成员,并提供了一个展示电动车信息的方法 displayElectricCarInfo,展示电动车的所有重要信息。
  5. 主函数:创建一个 ElectricCar 对象并调用 displayElectricCarInfo 来展示信息