dynamic_cast运算符可以在执行期决定真正的类型。如果 downcast 是安全的(也就说,如果基类指针或者引用确实指向一个派生类对象)这个运算符会传回适当转型过的指针。如果 downcast 不安全,这个运算符会传回空指针nullptr(也就是说,基类指针或者引用没有指向一个派生类对象)。
dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;
在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。
以上是百度百科的内容,我个人的理解就是dynamic_cast和static_cast差不多,都可以进行类型强转,但是在将基类的数据类型强转为派生类的数据类型的时候会失败并返回一个nullptr(空指针)
class A
{
public:
int m_iNum;
virtual void foo(){}
};
class B:public A
{
public:
char* m_szName[100];
};
int main()
{
B* bbb = new B;
//同数据类型强转
if(static_cast<B*>(bbb) == nullptr)
{
cout<<"static_cast<B*>(bbb) == nullptr"<<endl;
}
if(dynamic_cast<B*>(bbb) == nullptr)
{
cout<<"dynamic_cast<B*>(bbb) == nullptr"<<endl;
}
//派生类强转为基类类型
if(static_cast<A*>(bbb) == nullptr)
{
cout<<"static_cast<A*>(bbb) == nullptr"<<endl;
}
if(dynamic_cast<A*>(bbb) == nullptr)
{
cout<<"dynamic_cast<A*>(bbb) == nullptr"<<endl;
}
//基类强转为派生类
A* aaa = new A;
if(static_cast<B*>(aaa) == nullptr)
{
cout<<"static_cast<B*>(aaa) == nullptr"<<endl;
}
if(dynamic_cast<B*>(aaa) == nullptr)
{
cout<<"dynamic_cast<B*>(aaa) == nullptr"<<endl;
}
}
运行结果是 “dynamic_cast<B*>(aaa) == nullptr”
上述代码中A为基类,B为派生类。
说明只有在将A类(基类)对象强转为B类型(派生类)的时候会返回nullptr;
void DemoScene::onClose(EventContext* context)
{
if (!dynamic_cast<MenuScene*>(this))
{
TransitionFlipX* scene = TransitionFlipX::create(1, MenuScene::create());
Director::getInstance()->replaceScene(scene);
}
else
{
//Close the cocos2d-x game scene and quit the application
Director::getInstance()->end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit(0);
#endif
/*To navigate back to native iOS screen(if present) without quitting the application ,do not use Director::getInstance()->end() and exit(0) as given above,instead trigger a custom event created in RootViewController.mm as below*/
//EventCustom customEndEvent("game_scene_close_event");
//_eventDispatcher->dispatchEvent(&customEndEvent);
}
}
上面这段代码出自FairyGUI-cocos2dx-master的DemoScene.cpp。
DemoScene是一个基类被MenuScene继承。
if (!dynamic_cast<MenuScene*>(this)){}
上面这个if判断的意思就是判断当前的类对象是否是MenuScene生成的场景或者MenuScene的基类生成的场景
如果是,就会返回一个指针,然后执行
Director::getInstance()->end();
关闭整个窗口。(因为在Demo中MenuScene是生成第一个场景的类,所以此处是直接关闭的整个窗口)
如果不是MenuScene的类对象生成的窗口就会执行
TransitionFlipX* scene = TransitionFlipX::create(1, MenuScene::create());
Director::getInstance()->replaceScene(scene);
切换回到MenuScene的场景