在C ++中使用派生类的最佳实践

时间:2014-05-29 13:40:33

标签: c++ class inheritance polymorphism

我有一个基类:

class Base{
public:
    int id;
    virtual void method();
    bool identify(int _id);
...
}

和一些派生类:

class d1:public Base{
public:
    int id;
    void method();
    bool identify(int _id);
...
}

class d2:public Base{
public:
    int id;
    void method();
    bool identify(int _id);
...
}

每个子类在它的方法中彼此做不同的工作,根据它的id,方法identify()将检查这个子类是否必须处理数据。

现在,我有一个存储所有子类实例的数组,例如: Base * instances [];

当数据出现时,我做了:

for(i=0;i<instances.length;i++){
    Base *temp=instances[i];
    if(temp->identify(id))
        temp->method(data);
}

然而,我完成了工作。但是对这种方法感到不舒服。

所以,我的问题是:最佳做法是什么?

ps:我知道多态的概念,但只是不知道如何使用它。我是c ++的新手,任何帮助都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

如果你必须在调用代码中决定是否根据它的虚拟类型调用类的方法,那么你就不会以一种好的方式使用多态。多态性是关于使实现类的行为彼此不同,即使它们像它们的基类的实例一样使用。所以,你的代码应该是这样的:

class Base {
    public:
        virtual void method(int id, /*args*/) { }
};

class Derived1 : public Base {
    public:
        virtual void method(int id, /*args*/) override {
            if(id == something) {
                //Do stuff
            }
        }
};

class Derived2 : public Base {
    public:
        virtual void method(int id, /*args*/) override {
            if(id == somethingElse) {
                //Do other stuff
            }
        }
};

for(i=0;i<instances.length;i++) {
    instances[i]->method(data);
}

这个使用代码完全不知道它调用method()的对象类型,它应该知道的是它在method()的某些实现上调用Base。< / p>