RTTI的机制。

 

什么是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的消息类别庞大繁多,如果用都虚函数实现,那么将大大增加类的体积(虚函数表的体积,严格的说,没有增加类的体积,虚函数表是位于类外部的)。而且,写起来也太麻烦! 再加上类继承体系比较深,代码体积的增加的更是大了! 倒不是因为虚函数的效率而没有用虚函数。虽然虚函数的确会影响到效率,但是还没有到非不用不可的地步。因为即便是消息映射,每一个消息的处理也要跑一套消息映射网,花的时间不比虚函数的时间小!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值