C 将功能实现对象作为接口类型

C++ pass to function implementation object as interface type

本文关键字:接口类型 对象 实现 功能      更新时间:2023-10-16

我的接口看起来像这样:

class GameObject
{
public:
    virtual ObjType getType() = 0;
    virtual void setType(ObjType ot) = 0;
protected:
    ObjType objtype;

};

然后我有实现此接口的类

class SpriteObject : public GameObject
{
    public:
        SpriteObject();
        virtual ~SpriteObject();        
        ObjType getType() { return objtype; }
        void setType(ObjType ot) { objtype = ot; }
    private:
};

class LayerObject : public GameObject
    {
        public:
            LayerObject ();
            virtual ~LayerObject ();        
            ObjType getType() { return objtype; }
            void setType(ObjType ot) { objtype = ot; }
        private:
    };

在主类中,我具有将SpriteObject传递到的功能看起来这样:

bool HelloWorld::NodeAction(GameObject* &pGameObj)
{
}

当我尝试这样做时:

SpriteObject *pSpriteObject = new SpriteObject();
NodeAction(pSpriteObject);

我遇到此错误:

error C2664: 'bool HelloWorld::NodeAction(GameObject *&)' : cannot convert argument 1 from 'SpriteObject *' to 'GameObject *&'

最后,我想拥有可以获得实现GameObject的不同对象的全局函数。

此功能:

bool HelloWorld::NodeAction(GameObject* &pGameObj)

期望GameObject*的非CV LVALUE参考。

因为pSpriteObject是类型SpriteObject *的lvalue,因此没有匹配函数要呼叫,因此它将尝试使用隐式转换来查找这些转换的过载函数:

  • lvalue to rvalue conversion

    任何非功能,非阵列T型T的glvalue可以隐式转换为相同类型的序言。如果t是非类型的类型,则此转换也删除了CV-Qualifier。

  • 指针转换

    可以将(可选的是CV合格的)派生类类型的指针转换为prvalue指针,转换为其(相同CV征值)基类。

因此,这条线

nodeaction(pspriteObject);

期望具有其中一个原型的功能:

bool HelloWorld::NodeAction(GameObject*)
bool HelloWorld::NodeAction(GameObject* const&)
bool HelloWorld::NodeAction(GameObject* &&)

所有人都是可以接受的,但

bool HelloWorld::NodeAction(GameObject*)

应该优先考虑,请参阅此问题。使用原始类型,即使PRE-C 11

,逐个值也应比通过参考的速度快。