我有2个抽象类Organism
和Animal
以及普通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();
也是错误的,我收到错误消息:
合格的名字不是班级成员"有机体"或其基类
答案 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
。