我的界面看起来像这样:
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的不同对象的全局函数。
答案 0 :(得分:2)
此功能:
bool HelloWorld::NodeAction(GameObject* &pGameObj)
期望非{cv左值引用GameObject*
。
由于pSpriteObject
是SpriteObject *
类型的左值,因此没有匹配函数来调用它,它将尝试使用implicit conversion通过这些转换来查找重载函数:
左值转换的左值
任何非函数非数组类型T的glvalue都可以隐式转换为相同类型的prvalue。如果T是非类类型,则此转换也会删除cv限定符。
指针转换
指向(可选cv限定的)派生类类型的prvalue指针可以转换为指向其(相同的cv限定的)基类的prvalue指针。
因此,这一行
NodeAction(pSpriteObject);
期望使用其中一个原型的函数:
bool HelloWorld::NodeAction(GameObject*)
bool HelloWorld::NodeAction(GameObject* const&)
bool HelloWorld::NodeAction(GameObject* &&)
一切都可以接受,但
bool HelloWorld::NodeAction(GameObject*)
应该是首选,请参阅this question。对于基本类型,即使在C ++ 11之前,pass by value也应该比pass-by-reference更快