使用虚函数,减少累赘的if/else/switch

假设我们有不同的对象需要管理,我们可能建立一个类来包装一下实现对这些不同类型对象的管理,比如
class CObjManager
{
    public:
        bool     addObj_A(string const & strObjName,Other_params...);
        bool     addObj_B(string const & strObjName,Other_params...);
        .......
        bool     updateAllObj();
}
用add函数将对象添加到管理器内,然后在更新对象时,用updateAllObj()更新对象的数据,这么的话,update可能需要这么写

bool     CObjManager::updateAllObj()
{
    for(i=0 to num of object)
    {
        switch(object.type)
        {
            case A:
                ...
                break;
            case B:
                ...
                break;
            ...
        }
    }
}

我们可以这样使用这个管理器:

CObjManager  objManager;
objManager.addObj_A("This is object A",others...);
objManager.addObj_B("This is object B",others...);
在需要更新对象时,执行
objManager.updateAllObj()
即可

有没有觉得CObjManager::updateAllObj函数写得太难看了,尤其是当对象类型很多时更是如此。
下面看用虚函数怎么做这件事,完全不用这么多switch
首先定义一个对象的虚基类
class     CObjBase()
{
    public:
        CObjBase(string const & strObjName);
        virtual    bool    update()=0;
}
其中uodate为对象的更新函数,对于对象A来说,可以这么写
class     CObj_A():public CObjBase
{
    public:
        CObj_A(string const & strObjName,Other_params...):CObjBase(strObjName)
        {...}
        virtual    bool    update()
        {
            ...
        }
}
然后写一个对象管理器,如下
class CObjManager
{
    public:
        bool     updateAllObj()
        {
            for each obj
                obj.update();
        }
        bool    addObj(CObjBase    * pObj);
       
       ~CObjManager()
       {
        for each object
            delete object
       }
}
看到没有,这里的updateAllObj完全不用管对象具体是哪一个类型,这些繁琐的事情让c++干吧!
可以这么使用这个对象管理器
CObjManager  objManager;
objManager.addObj(new CObj_A("This is Obj A",..other param..));
objManager.addObj(new CObj_B("This is Obj B",..other param..));
在需要更新对象时,执行
objManager.updateAllObj()
即可
看,用起来还是很方便,但是看起来写起来却漂亮了很多,当需要增加新的类型时,只需要添加一个类就行了。。。

原文地址:https://www.cnblogs.com/cutepig/p/1310314.html