2014-12-07 61 views
-2

所以我使用了一個名爲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); 
    } 
} 
+0

這是錯誤的做法,因爲錯誤報告的原因。你不能以這種方式重載成員函數,因爲在重載和重載解析期間不考慮返回類型。如果你需要返回一個對象,你需要重新訪問你的設計,並根據需要修改基類。通過複製返回也可能是錯誤的。 – 2014-12-07 16:57:17

+0

你不能!你有能力改變基類中的純虛方法嗎? – 2014-12-07 16:57:47

+1

如果'Object'確實是抽象的,那麼返回值已經失效,因爲不允許實例化* real *抽象基(純虛擬和全部)。我感覺到一個設計問題。 – WhozCraig 2014-12-07 16:58:08

回答

0

當您使用重載時,編譯器通過檢查傳遞參數的類型來知道要調用哪個函數。所以如果參數相同,那麼可能的選擇應該只有一個。在你的情況下,有兩種可能的候選只有結果不同。如果您需要替代路線,請通過將「result」對象作爲參數傳遞的參數作爲最後一個參數來創建替代函數。 - 的

代替

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); 
+0

我實現了一個重載函數,但是如何使用Object *向量的重載函數呢?它不能識別重載的播放器函數,因爲它只接近來自基類的對象指針。 – James 2014-12-07 17:35:45

+0

@George給他們一個合適的樣本,請如何做到這一點。 – 2014-12-07 17:38:45

+0

我需要向編譯器指定由迭代器保存的當前Object *是Player對象,以便我可以使用重載更新方法。我用代碼更新了原始問題。 – James 2014-12-07 17:43:25

0

剛剛降級的指針類型爲所需的類型(播放器)。關於降級有很多問題和答案,所以你可以看看他們。任何方法都可以像(Player *)ObjectpPtr一樣通常完成指針的改變,但是如果你不確定Object是否真的是Player類型,那麼你可以重載函數作爲一個虛擬的Object並實現它只在播放器中,在這種情況下,不應該有必要進行這種類型的轉換。

相關問題