Menu
CoddyTech

基本继承

本课属于 Coddy C++ 学习旅程的“面向对象编程”单元。第 48 课,共 104 课。

继承允许一个类获取另一个类的属性和行为。被继承的类称为基类(或父类),继承其他类的类称为派生类(或子类)。

要创建派生类,请使用冒号,后面依次写访问说明符和基类名称:

class Animal {
public:
    std::string name;
    
    void eat() {
        std::cout << name << " is eating" << std::endl;
    }
};

class Dog : public Animal {
public:
    void bark() {
        std::cout << name << " says woof!" << std::endl;
    }
};

现在,Dog 类既可以使用 Animal 中的 name 和 eat(),也有自己的 bark() 方法。这就是继承的核心:复用现有代码,同时添加新功能。

Dog myDog;
myDog.name = "Buddy";
myDog.eat();    // 从 Animal 继承
myDog.bark();   // 在 Dog 中定义

Animal 前面的 public 关键字指定了继承类型。公有继承意味着基类的公有成员在派生类中仍然是公有的。这是最常见的继承形式,表示一种“是……”的关系:Dog 是一种 Animal。

challenge icon

挑战

简单

让我们构建一个简单的车辆继承体系,展示继承的实际效果。你将创建一个基类 Vehicle,以及一个派生类 Motorcycle,为它添加专门的行为。

你将把代码分成 3 个文件:

  • Vehicle.h:定义一个基类 Vehicle,其中包含:
    • 一个公开的 std::string brand 成员
    • 一个公开的 int year 成员
    • 一个公开的方法 displayInfo(),以如下格式打印车辆的品牌和年份:Brand: <brand>, Year: <year>
  • Motorcycle.h:定义一个公开继承自 Vehicle 的 Motorcycle 类。这个派生类应添加:
    • 一个公开的 int engineCC 成员,用于表示发动机排量
    • 一个公开的方法 revEngine(),打印:<brand> goes vroom vroom!

    Motorcycle 类会自动从 Vehicle 继承 brand、year 和 displayInfo()。

  • main.cpp:读取 3 个输入(每个输入占一行):
    1. 品牌名称(字符串)
    2. 年份(整数)
    3. 发动机排量(整数)

    创建一个 Motorcycle 对象,设置它继承来的成员(brand 和 year),以及它自己的 engineCC 成员。然后按顺序输出 3 行:先调用继承来的 displayInfo() 方法,接着用 std::cout << "Engine: " << moto.engineCC << "cc" << std::endl; 自行打印发动机排量,最后调用摩托车专属的 revEngine() 方法。这样就能通过使用继承来的方法和派生类自己的方法来展示继承。

    输出格式:

    Brand: <brand>, Year: <year>
    Engine: <engineCC>cc
    <brand> goes vroom vroom!

例如,输入 Harley、2022 和 1200 时:

Brand: Harley, Year: 2022
Engine: 1200cc
Harley goes vroom vroom!

别忘了在头文件中添加头文件保护宏,并在 Motorcycle 头文件中使用 #include "Vehicle.h" 来访问基类。

亲手试试

#include <iostream>
#include <string>
#include "Motorcycle.h"

using namespace std;

int main() {
    string brand;
    int year;
    int engineCC;

    cin >> brand;
    cin >> year;
    cin >> engineCC;

    // TODO: 创建一个 Motorcycle 对象
    // TODO: 设置它的 brand、year 和 engineCC 成员
    // TODO: 调用 displayInfo() 显示继承的信息
    // TODO: 按以下格式输出发动机信息:Engine: <engineCC>cc
    // TODO: 调用 revEngine() 展示摩托车特有的行为

    return 0;
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: C++ 在线编译器