对static_cast和dynamic_cast的个人理解,以及在FairyGUI-cocos2dx中的应用理解

​ 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的场景

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值