基本继承
本课属于 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。
挑战
简单让我们构建一个简单的车辆继承体系,展示继承的实际效果。你将创建一个基类 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 个输入(每个输入占一行):- 品牌名称(字符串)
- 年份(整数)
- 发动机排量(整数)
创建一个
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;
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C++ 在线编译器