什么是RTTI,RTTI就是运行时提供的一些类型信息,常用的功能包含如下两个方面
一: 能提供 一个指针运行时的名字。
举例常见的3种实现
p->Type_na() (程序员自己实现)
(p->GetRuntimeClass())->m_psClassName(类库实现,egMFC)
typeid(p).name()(C++编译器实现)
二: 能提供 一个指针运行时继承体系的知识。
举例常见的3中实现方式:
p->isa("rect")(程序员自己实现),
p->IsKindOf( "rect" )( 类库实现,egMFC )
dynamic_cast<CRect*>(p)(C++编译器提供)
dynamic_cast和isa是等价的,dynamic_cast内部就是isa的封装。
RTTI的不好处:
1) 利用RTTI也可以实现面向对象的多态,但是代价高。特别是继承层次较深的时候。 dynamic_cast<>要遍历继承层次,一个一个的查询是否是某个对象,可见代价之高。而利用虚函数,代价就低多了。虚函数最多了2个指针的操作,就实现了多态。
如果利用typaid(p).name()来实现多态,更是严重违反了 开放/封闭原则! 代价和dynamic_cast<>一样高昂就不说了,后期不利于维护扩展!
为何MFC的消息传递使用了消息传递网,是不是虚函数,和本议题没有关系。微软发现windows的消息类别庞大繁多,如果用都虚函数实现,那么将大大增加类的体积(虚函数表的体积,严格的说,没有增加类的体积,虚函数表是位于类外部的)。而且,写起来也太麻烦! 再加上类继承体系比较深,代码体积的增加的更是大了! 倒不是因为虚函数的效率而没有用虚函数。虽然虚函数的确会影响到效率,但是还没有到非不用不可的地步。因为即便是消息映射,每一个消息的处理也要跑一套消息映射网,花的时间不比虚函数的时间小!