dynamic_cast类型转换

  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转换时至少需要一个虚函数

posted on 2021-04-18 20:05  Animer  阅读(405)  评论(0)    收藏  举报