首页 > 其他 > 详细

dynamic_cast类型转换

时间:2021-04-18 21:33:47      阅读:11      评论:0      收藏:0      [点我收藏+]

  dynamic_cast 动态类型转换,运行时检查类型安全(转换失败返回NULL)

主要分两种情况:

1.向上转换:派生类指针或引用类型转为基类类型,本身是安全的 

#include <iostream>
using namespace std;

class Base
{
public:

    Base() {};
    virtual void  show() { cout << "This is Base class" << endl;; };
};
class Sub :public Base
{
public:
    int b;
    Sub() {};
    void show() { cout << "This is Derived class" << endl;; }
};


int main()
{

    //向上转型:派生类指针转换为其基类类型 本身是安全的,也可以通过dynamic_cast/static_cast进行转换 
    Base* base_0;
    Sub* su = new Sub();
    base_0 = su;
    //base_0 = static_cast<Base*>(su); 
        //base_0 = dynamic_cast<Base *>(su);
    //base_0->show();
}

2.向下转换:安全的向下转型,基类对象的指针或引用转换为派生类

#include <iostream>
using namespace std;

class Base
{
public:

    Base() {};
    virtual void  show() { cout << "This is Base class" << endl;; };
};
class Sub :public Base
{
public:
    int b;
    Sub() {};
    void show() { cout << "This is Derived class" << endl;; }
};
int main()
{
    // 安全的向下转型
    // 基类指针指向对象是派生类,转换安全 
    Base* base = new Sub;
    if (Sub* sub = dynamic_cast<Sub*>(base))
    {
        cout << "succeed" << endl;
    }
    else
    {
        cout << "failed" << endl;
    }
    base->show();
    delete base;
    base = nullptr;
    // 基类指针指向的对象是基类,转换失败
    Base* base_01 = new Base();
    if (Sub* sub_01 = dynamic_cast<Sub*>(base_01))
    {
        cout << "succeed" << endl;
    }
    else
    {
        cout << "failed" << endl;
    }
    base_01->show();
    delete base_01;
    base_01 = nullptr;

3.dynamic_cast 关于引用转换

#include <iostream>
using namespace std;

class Base
{
public:

    Base() {};
    virtual void  show() { cout << "This is Base class" << endl;; };
};
class Sub :public Base
{
public:
    int b;
    Sub() {};
    void show() { cout << "This is Derived class" << endl;; }
};


int main()
{
    //引用类型转换,

    //引用向上转换
    //
    Sub c;
    Sub& cc = c;
    Base& b = dynamic_cast<Base&>(cc);
    b.show();


    //向下转换
    //第一种情况
    Sub re_c;
    Sub &re = re_c;
    Base& base_02 = dynamic_cast<Base&>(re);
    base_02.show();
    //第二种情况,转换失败会抛出异常
    Base base_03;
    Base& base_04 = base_03;
    //不存在空引用,dynamic_cast失败会抛出bad_cast异常
    try
    {
        Sub& s = dynamic_cast<Sub&>(base_03);
    }
    catch (bad_cast)
    {
        cout << "cast to failed" << endl;
    }
    system("pause");
    }

注:使用dynamic_cast转换时至少需要一个虚函数

dynamic_cast类型转换

原文:https://www.cnblogs.com/zsymdbk/p/14674415.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!