我已经定义了一个如下的接口类。
class IRecyclableObject
{
public:
virtual ~IRecyclableObject() {}
virtual void recycle() = 0;
virtual void dump() = 0;
virtual int getRecycleTypeID() = 0;
};
以下是我的CharacterAI类,它继承了另一个类并实现了上面的接口类。它定义如下。
class CharacterAI : public harp::Character, public harp::IRecyclableObject
{
public:
CharacterAI();
virtual ~CharacterAI();
...
// -- note these 3 virtual functions -- //
virtual void recycle();
virtual void dump();
virtual int getRecycleTypeID();
...
};
接口中定义的这三个虚函数,我已经在CharacterAI类中正常实现了。那里没有什么花哨的东西。
是时候将它们与ObjectPool(自制)类一起使用了,其中可用对象的数据存储在
m_freeList
使用CCArray类。
问题出现在以下代码中。
IRecyclableObject* ObjectPool::popFreeObjectAndAddToActiveListForType(int recycleTypeID)
{
// search from free-list
for(unsigned int i=0; i<m_freeList->count(); i++)
{
IRecyclableObject* obj = (IRecyclableObject*)m_freeList->objectAtIndex(i);
CharacterAI *obj1 = (CharacterAI*)m_freeList->objectAtIndex(i);
CCLog("recycleTypeID : %d %d %d", obj->getRecycleTypeID(), recycleTypeID, obj1->getRecycleTypeID());
...
}
return NULL;
}
预期的结果是显示
recycleTypeID : 4 4 4
但我得到了
recycleTypeID : 524241408 4 4
第一个显然是垃圾,并且与每个循环随机不同。我试图在CharacterAI类中实现的函数getRecycleTypeID()中放置一个断点,然后再返回。我发现只有
obj1->getRecycleTypeID()
被称为但不是另一个。
通过关注obj变量,可以清楚地看到似乎不同的对象调用了该函数,原因可能来自将对象转换为接口类并使用 if 从那里它是错误的或某种类型。
那里发生了什么事?我可以将对象类型类转换为接口类指针(它实现)并正确调用接口类中定义的函数吗?