You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效利用多态(polymorphism)替代大量switch-case与if-else?

替代Switch-Case的多态优化方案

你已经正确用虚函数处理了对象的输入输出逻辑,但创建对象的switch-case确实会在类数量增加时变得臃肿。可以用对象工厂映射表彻底消除这部分分支判断,具体实现如下:

1. 定义工厂函数类型

先声明一个返回Human*的函数指针类型,用于统一各类子类的创建逻辑:

using HumanFactory = Human* (*)();

2. 为每个子类编写工厂函数

每个子类对应一个简单的创建函数,逻辑统一:

Human* createStudent() { return new Student; }
Human* createUndergrad() { return new Undergrad; }
Human* createWorker() { return new Worker; }
Human* createActor() { return new Actor; }
Human* createMusician() { return new Musician; }

3. 在Manage类中添加工厂映射表

用数组建立菜单选项和工厂函数的直接映射(因为选项是连续整数,数组比map更高效):

class Manage
{
private:
    Human *List[100];
    int iObject_num;
    // 索引对应菜单选项,0留空对应退出,1-5对应各子类
    HumanFactory factories[6] = {nullptr, createStudent, createUndergrad, createWorker, createActor, createMusician};
public:
    // 原有构造函数保持不变
    Manage(){
        iObject_num=0;
    }

4. 重构vInList函数,移除Switch-Case

现在可以直接通过选项索引调用对应工厂函数,彻底去掉分支判断:

void vInList()
{
    int choice;
    do
    {
        Menu(); // 菜单仍保留原有6个选项
        fflush(stdin);
        cin>>choice;
        if (choice == 0)
        {
            cout<<"Exiting...\n";
            break;
        }
        // 检查选项合法性
        if (choice >= 1 && choice <= 5 && factories[choice] != nullptr)
        {
            List[iObject_num] = factories[choice]();
            List[iObject_num]->vInPrivate();
            List[iObject_num]->vIn();
            iObject_num++;
        }
        else
        {
            cout<<"Invalid!\n";
        }
    } while(choice!=0);
}

额外优化建议

  • 修复内存泄漏:你的析构函数delete List;是错误的,List是栈上数组,需要循环删除每个元素:
    ~Manage(){
        for (int i = 0; i < iObject_num; i++)
        {
            delete List[i];
        }
    }
    
  • 改用智能指针:如果C++版本允许,用std::unique_ptr<Human>替代裸指针,无需手动管理内存:
    std::unique_ptr<Human> List[100];
    // 创建对象时:
    List[iObject_num] = std::unique_ptr<Human>(factories[choice]());
    // 析构函数无需手动delete
    
  • 扩展更便捷:新增子类时,只需要添加对应的工厂函数,再在factories数组中补充对应位置的指针即可,完全不需要修改vInList函数,符合开闭原则。

内容的提问来源于stack exchange,提问作者LilLee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 18:22:54