所以我使用了一個名爲Object的通用抽象類,並且該類的虛擬更新方法的返回類型爲void。重寫虛擬void方法時返回一個對象嗎? C++
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'
從我已經能夠找到這樣做是不好的形式,由於某些原因。但我不明白爲什麼。我需要在播放器類中創建新對象,並將它們返回到引擎中,以用於將在引擎中更新的對象矢量中。爲什麼這是不好的做法,我怎樣才能通過另一種方法實現同樣的目標?
所以我改變了喬治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);
}
}
這是錯誤的做法,因爲錯誤報告的原因。你不能以這種方式重載成員函數,因爲在重載和重載解析期間不考慮返回類型。如果你需要返回一個對象,你需要重新訪問你的設計,並根據需要修改基類。通過複製返回也可能是錯誤的。 – 2014-12-07 16:57:17
你不能!你有能力改變基類中的純虛方法嗎? – 2014-12-07 16:57:47
如果'Object'確實是抽象的,那麼返回值已經失效,因爲不允許實例化* real *抽象基(純虛擬和全部)。我感覺到一個設計問題。 – WhozCraig 2014-12-07 16:58:08