RTTI(Run-Time Type Information,通过运行时类型信息)程序能够使用基类的指针或者引用来检查这些指针或引用所指的对象的实际派生类对象。
RTTI提供了以下两个非常有用的操作符:
(1)typeid操作符,返回指针和引用所指的实际类型。
(2)dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用,dynamic_cast在转换的过程中必须有虚函数
#include<iostream>
using namespace std;
class A
{
private:
int num;
};
class B:public A
{
private:
int num;
};
void main()
{
A *pa = new A;
A *pb = new B;
cout << "*pa: " << typeid(*pa).name()<< " *pb: "<<typeid(*pb).name() << endl;
cout << "pa: " << typeid(pa).name ()<< " pb: " << typeid(pb).name() << endl;
cin.get();
}
可以看出typeid解析出*pa和*pb 都为class A
#include<iostream>
using namespace std;
class A
{
private:
int num;
virtual void go()
{
}
};
class B:public A
{
private:
int num;
void go()
{
}
};
void main()
{
A *pa = new A;
A *pb = new B;
cout << "*pa: " << typeid(*pa).name()<< " *pb: "<<typeid(*pb).name() << endl;
cout << "pa: " << typeid(pa).name ()<< " pb: " << typeid(pb).name() << endl;
cin.get();
}
从这可以看出,虚函数可以确定数据类型。
#include<iostream>
using namespace std;
class A
{
private:
int num;
virtual void go()
{
}
};
class B:public A
{
private:
int num;
void go()
{
}
};
void main()
{
A *pa = new A;
A *pb = new B;
B *pb1 = dynamic_cast<B*>(pa);
B *pb2 = dynamic_cast<B*>(pb);
if (pb1 == nullptr)
{
cout << "pa转换失败" << endl;//由于pa指向的A的对象但是其中并没有B的对象实体,在安全情况下其返回为空。
}
if (pb2 == nullptr)
{
cout << "pb转换失败" << endl;
}
cin.get();
}