dynamic_cast主要用于有继承关系的多态类(基类必须有虚函数)的指针或引用之间的转换。
1.通过dynamic_cast,将派生类指针转换为基类指针(上行转换),这个操作与static_cast的效果是一样的。
2.通过dynamic_cast,将基类指针转换为派生类指针(下行转换),dynamic_cast具有类型检查的功能,比static_cast更安全(如果转换的是指针,失败时会返回空指针;如果转换的是引用,会抛出std::bad_cast异常)
#include <iostream>
using namespace std;
class B{
public:
int m_b;
virtual void f(){};
};
class D:public B{
public:
int m_d;
};
B* doUpCast(D* pd)
{
B* pb = dynamic_cast<B*>(pd);
cout<<"doUpCast convert pd:"<<pd<<" to pb="<<pb<<endl;
return pb;
}
D* doDownCast(B* pb)
{
D* pd = dynamic_cast<D*>(pb);
if(pd == nullptr)
{
cout<<"doDownCast convert pb="<<pb<<" to pd failed"<<endl;
}
else
{
cout<<"doDownCast convert pb="<<pb<<" to pd="<<pd<<endl;
}
return pd;
}
int main()
{
B b;
D d;
B* pb1 = doUpCast(&d); //向上转型,输出:doUpCast convert pd:0x62fde0 to pb=0x62fde0
D* pd1 = doDownCast(pb1); //向下转型,将指向d的B*指针安全的转换为D*,输出:doDownCast convert pb=0x62fde0 to pd=0x62fde0
D* pd2 = doDownCast(&b); //向下转型,将指向b的B*指针转换为D*失败,输出:doDownCast convert pb=0x62fdf0 to pd failed
return 0;
}