C++抽象类与多态实战解析

这段 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; 是非法的)。
  • 成员变量包括 nameshool(应为 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;
}
  • 创建了 EnglishTeacherProTeacher 的对象,并分别调用了它们的方法。
  • 展示了多态:通过基类指针调用子类实现的方法。
  • 注意:动态分配内存后应当使用 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;
}

如果你希望进一步完善这个程序,比如添加构造函数设置 nameschoolmajor,或者使用智能指针来自动管理内存,请告诉我,我可以继续帮你优化!

相关推荐
lizz312 小时前
C++操作符重载深度解析
java·c++·算法
武子康2 小时前
Java-205 RabbitMQ 工作模式实战:Work Queue 负载均衡 + fanout 发布订阅(手动ACK/QoS/临时队列)
java·性能优化·消息队列·系统架构·rabbitmq·java-rabbitmq·mq
CodeCraft Studio2 小时前
Vaadin 25 正式发布:回归标准Java Web,让企业级开发更简单、更高效
java·开发语言·前端·vaadin·java web 框架·纯java前端框架·企业级java ui框架
Shirley~~2 小时前
PPTist 幻灯片工具栏Toolbar部分
开发语言·前端·javascript
|晴 天|2 小时前
Promise 与 async/await 错误处理最佳实践指南
开发语言·前端·javascript
_OP_CHEN2 小时前
【Python基础】(三)Python 语法基础进阶:条件循环 + 实战案例,从入门到精通的核心跳板
开发语言·python·python入门·条件语句·循环语句·python基础语法
苹果电脑的鑫鑫2 小时前
.eslintrc.js这个文件作用
开发语言·javascript·ecmascript
ytttr8732 小时前
matlab进行利用遗传算法对天线阵列进行优化
开发语言·算法·matlab
十五年专注C++开发2 小时前
QTableWidget和QTableView插入数据比较
c++·qt·qtablewidget·qtableview
无限进步_2 小时前
【C语言】队列(Queue)数据结构的实现与分析
c语言·开发语言·数据结构·c++·算法·链表·visual studio