2013-03-08 33 views
0

我的程序錯誤出在下面一行:如何修復由多態性引起的錯誤?

RAT_Entity* ecm = new RAT_EntityCustomModel(); 
ecm->Init(entities.size(), resourceManager->getCustomMesh(meshURL)); 

應該初始化一個孩子的實體,而是它打破我的引擎。是

爲RAT_Entity和RAT_EntityCustomModel的標題如下:

#ifndef RAT_ENTITY_H 
#define RAT_ENTITY_H 

#include <iostream> 

namespace RAT_ENGINE 
{ 
    class RAT_Entity 
    { 
    public: 
     RAT_Entity(); 
     ~RAT_Entity(); 

     virtual void Init(int argID, void* argVoid); 
     virtual void CleanUp(); 

     int getID() const; 

     virtual void PrintIO() const; 
    protected: 
     int id; 
    }; 
} 

#endif 

#ifndef RAT_ENTITYCUSTOMMODEL_H 
#define RAT_ENTITYCUSTOMMODEL_H 

#include "RAT_Entity.h" 
#include "RAT_CustomMesh.h" 

namespace RAT_ENGINE 
{ 
    class RAT_EntityCustomModel : public RAT_Entity 
    { 
    public: 
     RAT_EntityCustomModel(); 
     ~RAT_EntityCustomModel(); 

     void Init(int argID, RAT_CustomMesh* argMesh); 
     void CleanUp(); 

     RAT_CustomMesh* getMesh() const; 

     void PrintIO() const; 
    private: 
     RAT_CustomMesh* mesh; 
    }; 
} 

#endif 

正如你所看到的,void RAT_EntityCustomModel::Init(int argID, RAT_CustomMesh* argMesh)繼承virtual void RAT_Entity::Init(int argID, void* argVoid)此功能。我需要這樣做,否則我會得到以下錯誤:

1>e:\rat_engine\rat_engine\rat_engine\rat_entitymanager.cpp(34): error C2660: 'RAT_ENGINE::RAT_Entity::Init' : function does not take 2 arguments

但現在我的引擎在調用孩子的功能時會中斷。我怎樣才能解決這個問題?

+0

對於未來:刪除所有不必要的代碼,因爲它降低了可讀性(例如PrintIO,getMesh,私人網等無關你的問題)。如何查看導致「函數不帶2個參數」錯誤的命令? – Spook 2013-03-08 07:46:43

+0

我只能看到「不一致的命名約定」,沒有實現多態! – Nawaz 2013-03-08 07:47:40

+3

除非'RAT_CustomMesh *'與'void *'相同,否則它們不是相同的函數,並且將調用基類函數。虛函數在基類和派生類中必須具有完全相同的參數。 – 2013-03-08 07:51:33

回答

4

的事實,

RAT_Entity::Init 

RAT_EntityCustomModel::Init 

有不同的簽名錯誤的結果。因此,後者的功能不會覆蓋第一個功能。如果您傳入void*指針,則將調用RAT_Entity::Init。但是,您期望調用RAT_EntityCustomModel::Init

爲了固定這些類型的bug,我強烈建議使用在C++ 11引入了override關鍵字,即在RAT_EntityCustomModel::Init簽名更改爲

void Init(int argID, RAT_CustomMesh* argMesh) override; 

編譯器會抱怨這樣那樣的錯誤然後。但是,您需要一個符合C++ 11的編譯器。

+0

當我在聲明中添加override時,會出現以下錯誤信息: 1> e:\ rat_engine \ rat_engine \ rat_engine \ rat_entitycustommodel.h(15):error C3668:'RAT_ENGINE :: RAT_EntityCustomModel :: Init':method重寫說明符'覆蓋'沒有覆蓋任何基類方法 但它看起來完全像你的例子:'void Init(int argID,RAT_CustomMesh * argMesh)override;' – Friso 2013-03-08 08:29:12

+0

是因爲我的編譯器不是C++ 11兼容? – Friso 2013-03-08 08:29:30

+1

@ Friso1990:不,這是您正在等待的錯誤消息。它應該通過告訴你「RAT_EntityCustomModel :: Init」的定義沒有覆蓋任何基類方法來幫助你。現在您知道您必須更改「RAT_EntityCustomModel」或其基類之一中的方法定義。兩個方法''Init''定義的簽名必須通過將''RAT_CustomMesh *''改爲''void *''或反之。 – 2013-03-08 08:33:31

1

你有更深層次的問題。

你的RAT_EntityRAT_EntityCustomModel需要不同的東西才能正確初始化,可能完全不同的東西,我不能告訴。

他們之間的共性是他們需要的東西,不同的是他們想要不同的東西,例如RAT_CustomMesh

如果他們需要的東西都不是完全不同的,即它們都需要某種形式的網,那麼你可以通過RAT_Mesh作爲基類來代替void*參數。

如果它們被完全不同的東西初始化,那麼Entity需要決定它需要什麼。在這種情況下,通過一個資源管理器,從已有的資源管理器中修改一下,實體可以從中請求它所需的資源。

class ResourceManager { 
public: 
    RAT_PlainMesh* getPlainMesh(); 
    RAT_CustomMesh* getCustomMesh(); 
}; 

和基礎RAT_Entity初始化函數:

class RAT_Entity 
{ 
public: 
    virtual void Init(int argID, ResourceManager& resourceManager); 
    //... 
}; 
相關問題