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;
    
    }

    运行结果:

     一些结论:

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

  • 相关阅读:
    数据库之01-数据库概述
    Bootstrap框架
    jQuery
    补充:html速查表
    BOM,DOM相关案例
    BOM,DOM
    函数,词法分析,内置对象和方法
    前端 之 JaveScript 基础语法: 数据类型; 运算符; 数据转换; 流程控制; 常用内置对象;
    favicon.ioc使用以及注意事项
    redux-undo
  • 原文地址:https://www.cnblogs.com/z1141000271/p/15357024.html
Copyright © 2011-2022 走看看