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

Call method from abstract class in child class

本文关键字:调用 方法 抽象类 子类      更新时间:2023-10-16

我有 2 个抽象类OrganismAnimal和普通Fox

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

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

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

我有一个 Organism 和方法数组escape()只会为类Fox的对象调用(我必须在Organism中定义escape())如何调用action()escape()Animal中定义的方法?

此代码:

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

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

限定名不是类"有机体"或其基类的成员

似乎您想将动物特定的操作实现与其他操作实现区分开来。我建议在两个不同的成员函数中将这两种不同的含义分开。因此,您可以有一个(公共)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() {...}
};

你可以显式地确保你的指针是Fox类(或其派生的),只需使用dynamic_cast并检查结果:

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

如果提供的指针不是指向Fox类或其派生之一的指针,则dynamic_cast将返回nullptr