Dynamic_cast 和强制类型转换的区别

void GameMap::Draw()
{
CCObject* obj = NULL;
CCArray* p = m_MapsArr;
CCARRAY_FOREACH(m_MapsArr,obj)
{
IEnvBody* envBody = dynamic_cast(obj);
envBody ->Draw();
}
}

void HelloWorld::draw()
{
m_Entity ->Draw();
m_GameMap ->Draw();
}
中被调用
m_MapsArr 放入的是EnvTriangle 并且重写了父类中的Draw
类图如下
图片说明
为什么
IEnvBody* envBody = (IEnvBody*)(obj);
就会有
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
的错误
请求指教

dynamiccast是用在父类跟子类的指针之间转换 强制类型转换可以在任何类型