15 RTTI(运行时类型识别)
程序能够获取由基指针或引用所指向的对象的实际派生类型,即允许“用指向基类的指针或引用来操作对象”的程序能够获取到“这些指针或引用所指对象”的实际派生类型。在C++中,为了支持RTTI提供了两个操作符:dynamic_cast和typeid。
注意:g++ RTTI 开启/关闭:-frtti / -fno-rtti
在VC6.0运行时,记得把编译选项加上“/GR“ ,否则编译时会出现Warning(工程--设置--C/C++---工程选项)。因为VC6.0默认不开启RTTI
15.1 dynamic_cast
dynamic_cast可以获取目标对象的引用或指针:
T1 obj;
T2* pObj = dynamic_cast<T2*>(&obj); //转换为T2指针,失败返回NULL
T2& refObj = dynamic_cast<T2&>(obj); //转换为T2引用,失败抛出bad_cast异常
在使用时需要注意:被转换对象obj的类型T1必须是多态类型,即T1必须公有继承自其它类? 或者T1拥有虚函数(继承或自定义)。若T1为非多态类型,使用dynamic_cast会报编译错误。
问题1:http://bbs.csdn.net/topics/390723010
问题2:以下为出错程序
#include<iostream>
using namespace std;
class A
{
virtual void func(){};
};
class B:public A
{};
class C:public B
{};
int main()
{
A a;
B b;
C c;
A *pa = dynamic_cast<A*>(&b);
if(pa == NULL)
{
cout << "子类转父类失败!" << endl;
}
else
cout << "pa = " << pa << endl;
C *pc = dynamic_cast<B*>(&b);
if(pc == NULL)
{
cout << "父类转子类失败!" << endl;
}
else
cout << "pc = " << pc << endl;
return 0;
}
15.2 typeid
参考文章:
http://wei.si/blog/2012/03/about-dynamic_cast/
http://www.cnblogs.com/weidagang2046/archive/2010/04/10/1709226.html
http://www.cppblog.com/smagle/archive/2010/05/14/115286.aspx
http://www.cnblogs.com/ider/archive/2011/08/01/cpp_cast_operator_part5.html