覆盖虚拟void方法时返回一个对象? C ++

时间:2014-12-07 16:52:37

标签: c++ return override virtual

所以我使用了一个名为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);
    }
}

2 个答案:

答案 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中,在这种情况下,不需要进行那种类型的转换。