zoukankan      html  css  js  c++  java
  • c++中dynamic_pointer_cast强制类型转换

    #include <iostream>
    #include <memory>
     
    using namespace std;
     
    class CBase
    {
    public:
        CBase() { }
        virtual ~CBase() { }
     
        void myBase()
        {
            cout << "CBase::myBase" << endl;
        }
    };
     
    class CDerive : public CBase
    {
    public:
        CDerive() { }
        ~CDerive() { }
     
        void myDerive()
        {
            cout << "CDerive::myDerive" << endl;
        }
    };
     
    int main(void)
    {
        //上行的转换(派生类到基类的转换)
        shared_ptr<CDerive> spDeriveUp;
        shared_ptr<CBase> spBaseUp;
        spDeriveUp = make_shared<CDerive>();
        spBaseUp = dynamic_pointer_cast<CBase>(spDeriveUp);
        spBaseUp->myBase();
     
        //下行的转换(基类到派生类的转换)
        shared_ptr<CDerive> spDeriveDown;
        shared_ptr<CBase> spBaseDown;
        spBaseDown = make_shared<CBase>();
        spDeriveDown = dynamic_pointer_cast<CDerive>(spBaseDown);
        if (spDeriveDown == NULL)    //由于会进行类型的检查,这边是返回NULL
            cout << "spDeriveDown is null" << endl;
     
        /*
        shared_ptr<CDerive> spDeriveDown;
        shared_ptr<CBase> spBaseDown;
        spBaseDown = make_shared<CDerive>();
        spDeriveDown = dynamic_pointer_cast<CDerive>(spBaseDown);
        if (spDeriveDown == NULL)    //由于会进行类型的检查,这边是返回NULL
            cout << "spDeriveDown is null" << endl;
        spDeriveDown->myDerive();
        */
     
        return 0;
    
    }

    运行结果:

    #include <iostream>
    #include <memory>
     
    using namespace std;
     
    class CBase
    {
    public:
        CBase() { }
        virtual ~CBase() { }
     
        void myBase()
        {
            cout << "CBase::myBase" << endl;
        }
    };
     
    class CDerive : public CBase
    {
    public:
        CDerive() { }
        ~CDerive() { }
     
        void myDerive()
        {
            cout << "CDerive::myDerive" << endl;
        }
    };
     
    int main(void)
    {
        //上行的转换(派生类到基类的转换)
        shared_ptr<CDerive> spDeriveUp;
        shared_ptr<CBase> spBaseUp;
        spDeriveUp = make_shared<CDerive>();
        spBaseUp = dynamic_pointer_cast<CBase>(spDeriveUp);
        spBaseUp->myBase();
     
        //下行的转换(基类到派生类的转换)
        /*
        shared_ptr<CDerive> spDeriveDown;
        shared_ptr<CBase> spBaseDown;
        spBaseDown = make_shared<CBase>();
        spDeriveDown = dynamic_pointer_cast<CDerive>(spBaseDown);
        if (spDeriveDown == NULL)    //由于会进行类型的检查,这边是返回NULL
            cout << "spDeriveDown is null" << endl;
        */
     
        shared_ptr<CDerive> spDeriveDown;
        shared_ptr<CBase> spBaseDown;
        spBaseDown = make_shared<CDerive>();
        spDeriveDown = dynamic_pointer_cast<CDerive>(spBaseDown);
        if (spDeriveDown == NULL)    //由于会进行类型的检查,这边是返回NULL
            cout << "spDeriveDown is null" << endl;
        spDeriveDown->myDerive();    
     
        return 0;
    
    }

    运行结果:

     一些结论:

       子类向基类转是一定没有问题的。基类转子类的话,必须基类的动态类型与要转换的子类一致

  • 相关阅读:
    什么是Code Review
    支撑5亿用户、1.5亿活跃用户的Twitter最新架构详解及相关实现
    shell的数组操作
    CDN(内容分发网络)技术原理
    云计算服务模型,第 3 部分: 软件即服务(PaaS)
    Mongodb
    360的开源项目
    用linux mail命令发送邮件[Linux]
    BZOJ2761:[JLOI2011]不重复数字(map)
    BZOJ1821:[JSOI2010]部落划分(并查集,二分)
  • 原文地址:https://www.cnblogs.com/z1141000271/p/15357024.html
Copyright © 2011-2022 走看看