如何修复由多态引起的错误?

时间:2013-03-08 07:43:15

标签: c++ inheritance polymorphism game-engine

我的程序在以下行中出错:

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&gt; e:\ rat_engine \ rat_engine \ rat_engine \ rat_entitymanager.cpp(34):错误   C2660:'RAT_ENGINE :: RAT_Entity :: Init':函数不带2   参数

但现在我的引擎在调用孩子的功能时会中断。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

该错误源自

RAT_Entity::Init

RAT_EntityCustomModel::Init

有不同的签名。结果,后一种功能不会覆盖第一种功能。如果您传入void*指针,则会调用RAT_Entity::Init。但是,您希望调用RAT_EntityCustomModel::Init

为了修复这些类型的错误,我强烈建议使用C ++ 11中引入的override关键字,即将RAT_EntityCustomModel::Init中的签名更改为

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

编译器会抱怨这种错误。但是,您需要符合C ++ 11的编译器。

答案 1 :(得分:1)

你有更深层次的问题。

您的RAT_EntityRAT_EntityCustomModel需要不同的东西才能正确初始化,可能是完全不同的东西,我无法分辨。

他们之间的共同点是他们需要一些东西,区别在于他们需要不同的东西,例如RAT_CustomMesh

如果他们需要的东西没有完全不同,即他们都需要某种网格,那么你可以将RAT_Mesh作为参数传递给基类,而不是void*

如果用完全不同的东西初始化它们,那么Entity需要决定它需要什么。在这种情况下,传递一个资源管理器,从您已经修改过的资源管理器,可以从中请求实体所需的资源管理器。

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

基础RAT_Entity init函数:

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