这段 C++ 代码演示了 抽象类(Abstract Class) 和 多态(Polymorphism) 的使用,它定义了一个表示教师的抽象基类 Teacher
,并派生出两个具体的子类:EnglishTeacher
(英语老师)和 ProTeacher
(编程老师),每个子类都实现了从父类继承来的纯虚函数。
🧠 代码结构分析
1. 抽象类 Teacher
class Teacher {
public:
string name;
string shool; // 拼写错误,应为 school
string major;
virtual void goInClass() = 0;
virtual void startTeaching() = 0;
virtual void afterTeaching() = 0;
};
- 这是一个抽象类,因为包含了至少一个 纯虚函数(pure virtual function)。
- 纯虚函数:
goInClass()
、startTeaching()
、afterTeaching()
都是纯虚函数(= 0
表示没有实现,必须由子类实现)。
- 不能直接实例化这个类的对象(例如:
Teacher t;
是非法的)。 - 成员变量包括
name
、shool
(应为school
)、major
,但这些成员在主函数中并没有被赋值或使用。
2. 子类 EnglishTeacher
class EnglishTeacher : public Teacher {
public:
void goInClass() override {
cout << "英语老师开始进入教室" << endl;
}
void startTeaching() override {
cout << "英语老师开始教学" << endl;
}
void afterTeaching() override {
}
};
- 继承自
Teacher
。 - 实现了三个纯虚函数。
afterTeaching()
是空实现(无输出)。
3. 子类 ProTeacher
class ProTeacher : public Teacher {
public:
void goInClass() override {
cout << "编程老师开始进入教室" << endl;
}
void startTeaching() override {
cout << "编程老师开始撸代码了,拒绝读PPT" << endl;
}
void afterTeaching() override {
cout << "编程老师下课后手把手教x学员写代码" << endl;
}
};
- 同样继承自
Teacher
。 - 所有方法都有具体实现,特别是
afterTeaching()
有详细的输出信息。
4. 主函数 main()
int main()
{
// Teacher t; // 抽象类不能实例化,这行被注释掉了
EnglishTeacher e;
e.goInClass(); // 调用英语老师的 goInClass()
ProTeacher t;
t.startTeaching(); // 编程老师开始教学
t.afterTeaching(); // 编程老师下课后的动作
// 使用抽象类指针指向 ProTeacher 对象,展示多态
Teacher* teacher = new ProTeacher;
teacher->startTeaching(); // 调用 ProTeacher 的 startTeaching()
delete teacher; // 记得释放内存!
return 0;
}
- 创建了
EnglishTeacher
和ProTeacher
的对象,并分别调用了它们的方法。 - 展示了多态:通过基类指针调用子类实现的方法。
- 注意:动态分配内存后应当使用
delete
释放,避免内存泄漏。
✅ 输出结果解释
程序运行后输出如下:
英语老师开始进入教室
编程老师开始撸代码了,拒绝读PPT
编程老师下课后手把手教x学员写代码
编程老师开始撸代码了,拒绝读PPT
💡 总结
使用到的关键知识点:
- 抽象类(Abstract Class)
- 纯虚函数(Pure Virtual Function)
- 函数重写(Override)
- 多态(Polymorphism)
- 堆内存管理(new / delete)
📝 加上完整注释的代码如下:
#include <iostream>
using namespace std;
// 抽象类 Teacher,包含三个纯虚函数
class Teacher {
public:
string name;
string shool; // 应为 school,拼写错误
string major;
// 纯虚函数,表示不同阶段的教学行为
virtual void goInClass() = 0;
virtual void startTeaching() = 0;
virtual void afterTeaching() = 0;
};
// 英语老师类,继承自 Teacher
class EnglishTeacher : public Teacher {
public:
// 实现进入教室的动作
void goInClass() override {
cout << "英语老师开始进入教室" << endl;
}
// 实现教学过程
void startTeaching() override {
cout << "英语老师开始教学" << endl;
}
// 教学结束后的操作(空实现)
void afterTeaching() override {
}
};
// 编程老师类,继承自 Teacher
class ProTeacher : public Teacher {
public:
// 实现进入教室的动作
void goInClass() override {
cout << "编程老师开始进入教室" << endl;
}
// 实现教学过程
void startTeaching() override {
cout << "编程老师开始撸代码了,拒绝读PPT" << endl;
}
// 实现课后辅导
void afterTeaching() override {
cout << "编程老师下课后手把手教x学员写代码" << endl;
}
};
int main()
{
// Teacher t; // 抽象类不能直接实例化,该行被注释
// 创建英语老师对象并调用其方法
EnglishTeacher e;
e.goInClass(); // 输出:英语老师开始进入教室
// 创建编程老师对象并调用其方法
ProTeacher t;
t.startTeaching(); // 输出:编程老师开始撸代码了,拒绝读PPT
t.afterTeaching(); // 输出:编程老师下课后手把手教x学员写代码
// 多态:使用 Teacher 基类指针指向 ProTeacher 对象
Teacher* teacher = new ProTeacher;
teacher->startTeaching(); // 输出:编程老师开始撸代码了,拒绝读PPT
// 释放动态分配的内存
delete teacher;
return 0;
}
如果你希望进一步完善这个程序,比如添加构造函数设置 name
、school
、major
,或者使用智能指针来自动管理内存,请告诉我,我可以继续帮你优化!