dynamic_cast运算符,用于将基类的指针或引用安全地转换成派生类的指针或引用。
当我们将这两个运算符用于某种类型的指针或引用时,并且该类型含有虚函数,运算符将使用指针或引用所绑定对象的动态类型
三种使用形式
dynamic_cast<type*> (e) //e必须为指针
dynamic_cast<type&> (e) // e 必须为一个左值
dynamic_cast<type&&> (e) //e不能是左值
//有虚函数
class A
{
public:
A() {}
virtual ~A() {}
};
class B :public A
{
public:
B() {}
virtual ~B() {}
};
class C :public B
{
public:
C() {}
virtual ~C() {}
};
class D :public B, public A
{
public:
D() {}
virtual ~D() {}
};
//没有虚函数
class E
{
public:
E() {}
~E() {}
void get()
{
printf("eeeeeeeeeeee\n");
}
};
class F:public E
{
public:
F() {}
~F() {}
void get()
{
printf("ffffffffffff\n");
}
};
int main()
{
A *pa = new C;
if (B *pb = dynamic_cast<B*>(pa))
{
cout << "True" << endl;
}
else
{
cout << "False" << endl;
}//因为指针类型的转换失败返回为0可以使用条件中赋值判断
try
{
// D &cp = dynamic_cast<D&>(*pa);//错误 只能派生类转父类
C &cp = dynamic_cast<C&>(*pa);//正确,*pa的类型是C
cout << "cp" << endl;
}
catch (std::bad_cast e)
{
cout << e.what() << endl;
}//引用类型失败返回的是bad_cast
B *pbb = new B;
// if (C *pc = static_cast<C*>(pbb)) //用static_cast 则可以转成功
if (C *pc = dynamic_cast<C*>(pbb))
{
cout << "True" << endl;
}
else
{
cout << "False" << endl;
}
A *paa = new D;
if (B *pc = dynamic_cast<B*>(paa))
{
cout << "True" << endl;
}
else
{
cout << "False" << endl;
}
E* pe = new E;
E* pf = new F;
// F* pg = dynamic_cast<F*>(pe); //基类转派生类 必须要有虚函数
F* pg = static_cast<F*>(pe); //使用static_cast 不会报错 但是有可能是不安全的
// E* pg = dynamic_cast<E*>(pf); //派生类转基类 怎么转都是安全的
printf("%d\n",&pg);
//get 未定义成虚函数 不能形成多态
pe->get(); // eeeeeeeeeee
pf->get(); // eeeeeeeeeee
system("pause");
return 0;
}
本文截取 c++ primer 第五版 730页