次のようなインターフェイス クラスを定義しました。
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();
...
};
インターフェイスで定義されているこれら 3 つの仮想関数は、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 を使用することが原因である可能性があることが明確にわかります。
何が起こっているのですか?オブジェクト型クラスをインターフェイス クラス ポインター (それが実装する) にキャストし、インターフェイス クラスで定義されている関数を正しく呼び出すことはできますか?