类型识别
RTTI的意思是运行时类型识别,之所以存在这个功能,是因为c++通过父类指针实现多态,父类指针可以指向自己所有的派生类对象,指的多了就会出现问题,程序到某一时刻,父类指针究竟指向哪种派生类对象呢?
Human *phuman = new Men;
假设有个父类是Human,子类是Men(毕竟男人属于人类的一种)。通过以上语句,令Human类型的指针指向一个Men对象,Human类中存在虚函数,因此构成了一种多态。
但是时间久了,隔了好多行代码,Human这个父类又有一堆子类,因此很容易在某个时间节点搞不清楚当前的*phuman指向的到底是哪种类型,因此需要额外手段进行判断。
cout << typeid(*phuman).name() << endl;
通过typeid运算符可以得知当前父类指针指向的类型。
可以看到,程序打印出了“class Men”,说明当前*phuman指向的是一个Men类型的对象。
类型转换
除了识别当前父类指针指向的子类类型之外,还需要考虑一个问题:多态实现了父类指针对子类虚函数的调用,这很方便。但是子类的函数未必都是虚函数,有些成员函数是非虚的,并不能通过父类指针进行调用,那该怎么办?
这个时候就需要对父类指针进行转换了,将其转换为正确的子类指针。当然,前提是已经清楚父类指针当前指向的对象的类型。
Men *pmen = dynamic_cast<Men*>(phuman);
pmen->testfunc();
通过dynamic_cast运算符可以将一个基类指针转换为一个父类指针。该运算符其实主要是为开发者进行一个检查,如果*pmen的结果是nullptr的话,说明*phuman指向的并不是一个Men类型的对象。