1.使用方式:
dynamic_cast的使用说明:
(1)只能有用于指针和引用的转换,将父类指针或引用转换为子类指针和引用
(2)要转换的类型中必须包含虚函数
(3)如果转换成功,返回的就是子类的地址,如果转换失败,返回NULL
typeid的使用说明:
(1)返回一个type_info对象的引用,type_info类的结构见下图:
(2)如果想通过基类的指针获得派生类的数据类型,那么基类必须带有虚函数
(3)typeid只能获取对象的实际类型,没法判断某个指针是基类还是子类,必须加*
typeid(*obj)。
2.运行时类型识别RTTI的特点如下:
(1)可以通过父类指针识别其所指向对象的真实数据类型
(2)RTTI必须建立在虚函数的基础上
(3)
Movable * p = new Bus();
cout<<typeid(*p).name()<<endl;//打印结果为Bus,返回指针指向的对象的类型
cout<<typeid(p).name()<<endl;//打印结果为Movable,返回指针本身的类型
(4) Movable * obj;
Bus bus = dynamic_cast<Bus&>(*obj);//正确
Bus bus = dynamic_cast<Bus*>(obj);//正确
Bus bus = dynamic_cast<Bus>(*obj);//错误,错误详细信息如下:
/474/9251/BNIP/index.cpp: In function 'void doSomething(Movable*)':
/474/9251/BNIP/index.cpp:66:41: error: cannot dynamic_cast '* obj' (of type 'class Movable') to type 'class Bus' (target is not pointer or reference)
Bus bus = dynamic_cast(*obj);