Я делаю игру, которая использует физический движок Box2D, и я столкнулся с некоторыми странностями с указателем стека (ESP) и множественным наследованием. Мне удалось воспроизвести его в минимальном объеме кода, и кажется, что порядок, в котором я объявляю классы для использования в множественном наследовании, похоже, определяет, происходит ли сбой программы или нет.
#include <iostream>
#include <string.h>
using namespace std;
class IPhysicsObject
{
public:
virtual void Collide(IPhysicsObject *other, float angle, int pos)=0;
};
class IBoardFeature
{
public:
IBoardFeature(){};
~IBoardFeature(){};
virtual bool OnAttach(int x){ return true; }
virtual bool Update(int x, float dt)=0;
};
/*
class CScorezone : public IBoardFeature, public IPhysicsObject // this breaks !!!
class CScorezone : public IPhysicsObject, public IBoardFeature // this works !!!
*/
class CScorezone : public IBoardFeature, public IPhysicsObject
{
public:
CScorezone(){}
~CScorezone(void){}
virtual bool Update(int x, float dt)
{
return true;
}
virtual void Collide(IPhysicsObject *other, float angle, int pos)
{
}
virtual bool OnAttach(int x){ return true; }
};
int main(int argc, char *argv[])
{
CScorezone *scoreZone = new CScorezone();
CScorezone *otherZone = new CScorezone();
void *voidZone = scoreZone;
IPhysicsObject *physZone = static_cast<IPhysicsObject*>(voidZone);
physZone->Collide(otherZone, 10, 1);
delete scoreZone;
delete otherZone;
// wait for user input
int x;
cin >> x;
return 0;
}
Запуск этого в режиме отладки вызывает следующую ошибку
Ошибка проверки времени выполнения # 0 - значение
ESP не был сохранен должным образом через
вызов функции. Обычно это
результат вызова объявленной функции
с одним соглашением о вызовах с
указатель функции объявлен с
другое соглашение о вызовах.
Когда я перехожу к следующей строке кода:
physZone->Collide(otherZone, 10, 1);
Я заметил, что это происходит в CScoreZone :: OnAttach, а не в CScoreZone :: Collide. Почему это? Когда я меняю порядок наследования для CScoreZone, он отлично работает
class CScorezone : public IPhysicsObject, public IBoardFeature
Я работаю на VS2005 SP2 (8.0.50727.768) на Windows XP. Есть идеи?