所以我使用了一个名为Object的通用抽象类,该类的虚拟更新方法的返回类型为void。
virtual void update(std::string, int, std::vector<Object*>) = 0;
但是我需要从我从Object类扩展的Player类返回一个对象。
Object update(std::string , int , std::vector<Object*>);
但是当我尝试覆盖函数的返回类型时,我收到以下错误:
error C2555: 'Player::update': overriding virtual function return type differs and is not covariant from 'Object::update'
从我能够找到的,由于某种原因这是不好的形式。我真的不明白为什么。我需要在播放器类中创建新对象并将它们返回到引擎,以便在将在引擎内更新的对象向量中使用。为什么这是不好的做法,如何通过另一种方法实现同一目标?
所以我按照George Kourtis的回答修改了程序,但现在我遇到了另一组问题。我需要循环遍历Object指针的向量(游戏中的所有内容都是从抽象的Object类扩展出来的)并更新每个对象。如果我重载播放器更新方法以包含对象指针作为返回类型和参数,那么如何从向量循环更新播放器?我需要指定Object *类型的向量中的这个特定Object *是一个Player对象,以便它接受重载的更新函数。
void Engine::objectUpdate(string command){
if((*currentObject)->getType() == PLAYER){
Bullet* tempBullet = new Bullet();
tempBullet = (*currentObject)->update(command,getNumObjects(),subVector,tempBullet);
subVector.push_back(tempBullet);
}
else{
(*currentObject)->update(command,getNumObjects(),getObjects());
}
if(((*currentObject)->getType() == PLAYER)&&((*currentObject)->getPosX()>=getFinishLine())){
setGameOver(true);
}
}
答案 0 :(得分:0)
使用重载时,编译器通过检查传递的参数类型来了解要调用的函数。因此,如果参数相同,那么可能的选择应该只有一个。在您的情况下,有两种可能的候选者仅在结果上有所不同。如果您需要替代路线,请通过传递&#34;结果&#34;作为最后一个参数来创建您的替代功能。 object作为参考传递的参数。 -
而不是
Object update(std::string , int , std::vector<Object*>);
void update(std::string , int , std::vector<Object*>, Object& o);
而不是写作:
Object a=update(s,i,v);
你会写:
Object a;update(s,i,v,a);
答案 1 :(得分:0)
只需将指针类型降级为所需类型(播放器)即可。关于降级有很多问题和答案,所以你可以看看它们。无论如何,指针的更改通常都可以像(Player *)ObjectpPtr那样完成,但如果您不确定Object是否真的属于Player类型,则可能会出现问题,相反,您可以将函数作为虚拟内部对象重载并实现它只在Player中,在这种情况下,不需要进行那种类型的转换。