一、RTTI(Run Time Type Identification)是什么:运行时类型识别
通过运行时类型识别,程序能够使用基类或者引用来检查这些指针或者引用所指的对象的实际派生类型。
RTTI我们可以把这个称呼看成是一种系统提供给我们的一种能力,或者一种功能。这种功能或者能力是通过2个运算符来体现:
(1)dynamic_cast运算符:能够将基类的指针或者引用安全的转换为派生类的指针或者引用。
(2)typeid运算符:返回指针或者引用所指对象的实际类型
要想让RTTI的两个运算符能够正常工作,那么基类中必须至少要有一个虚函数,不然这两个运算符工作的结果接可能跟我们预期的不一样。因为只有虚函数的存在,这两个运算符才会使用指针或者引用所绑定的对象的动态类型(你new的类型)
二、dynamic_cast运算符
看如下代码:
class A
{
public:
int a;
A()
{
cout << "A::A()\n";
}
~A()
{
cout << "A::~A()\n";
}
};
class C:public A
{
public:
int c;
C()
{
cout << "C::C()\n";
}
~C()
{
cout << "C::~C()\n";
}
void goc()
{
cout << "C::goc()\n";
}
};
void main()
{
A *pa = new C();
//C语言风格:
C *pc = (C*)pa;
pc->goc();
system("pause");
}
使用dynamic_cast运算符能够帮我们做安全检查
看下面的代码:
void main()
{
A *pa = new C();
C *pc = dynamic_cast<C *>(pa);
if (pc)
{
pc->goc();
}
else
{
cout << "转化失败!\n";
}
system("pause");
}
结果:
现在增加一个类:
class Test
{
public:
int a;
Test()
{
}
~Test()
{
}