从子类中的抽象类调用方法

时间:2017-04-22 18:36:35

标签: c++ oop inheritance

我有2个抽象类OrganismAnimal以及普通Fox

class Organism {
    ...
    virtual void action() = 0;
    void escape();
};


class Animal : public Organism {
    ...
    void action() {...}
};


class Fox : public Animal {
    ...
    void action() {...}
};

我有一系列生物,方法escape()只会调用来自Fox类的对象(我必须在escape()中定义Organism)如何调用action()Animal中定义的escape()方法?

此代码:

void Organism::escape() {
    ...
    this->action();
    ...
}

调用action()中定义的Fox。我无法写this->Organism::action() 因为这种方法在Organism中是纯虚拟的,this->Animal::action();也是错误的,我收到错误消息:

  

合格的名字不是班级成员"有机体"或其基类

2 个答案:

答案 0 :(得分:0)

似乎您想要区分动物特定动作实现与其他动作实现。我建议在两个不同的成员函数中分离这两个不同的含义。因此,您可以拥有(公共)action和特定的动物实现,可能仅在escape内使用,因此受到保护:

class Organism {
    ...
    virtual void action() = 0;
    void escape() {
      // refer specifically to animal specific code
      animalAction();
    }

    protected:
    virtual void animalAction()=0;
};


class Animal : public Organism {
    ...
    virtual void action() {
      animalAction();
    }
    virtual void animalAction() {
      // animal specific code
    };
};


class Fox : public Animal {
    ...
    void action() {...}
};

答案 1 :(得分:0)

您可以明确确保指针属于Fox类(或其派生词),只需使用dynamic_cast并检查结果:

// Organism * array[];
Fox * pFox = dynamic_cast<Fox*>(array[i]);
if(pFox != nullptr){
    pFox->escape();
}

如果提供的指针不是指向dynamic_cast类或其衍生物的指针,nullptr将返回Fox