手工实现RTTI

    运行时的动态类型检查(RTTI,Run Time Type Indentifiation)是c++中提供的一项语言机制,它主要用于判断多态对象的具体类型。
    为什么不使用c++提供的RTTI功能
    但c++中直接提供的RTTI存在一些缺点。首先它提供了取得类名(typeinfo中的name函数)的功能,这个功能实际上并不是RTTI必须的。很多时候我们不需要取得类的名字,而只是希望判断某对象的具体类型。而且typeinfo取得的名字还不一定是可移植的,不同编译器取得的类型名字不一定一样。
    其次,在大多数情况下如果打开RTTI,一般来说程序中的所有多态类都会附加上RTTI信息的开销,而我们常常只需要选择其中某些类具有RTTI的功能就可以了。
    总的来说,c++语言提供的RTTI与编译器相关,并不是可控的。因此我们有必要自己实现一份RTTI。
    如何实现自己的RTTI?
首先需要知道如何为需要RTTI功能的类分配一个唯一的ID号。这个问题可以在STL的国际化对象Locale中找到答案。在Locale中定义了一个名为id的类,id类中没有任何成员,每一个facet类都有一个id类的静态对象。这样程序在初始化的时候会为每一个facet类中的静态id对象分配1byte的空间。这样某个facet类的静态id对象的地址就是该类的唯一标识符。
    我们需要RTTI的类中也可以存放这样一个静态对象,其地址用于唯一标记每一个类。还有一个问题就是我们需要追溯一个类的所有父类。这样我们可以在每个静态ID对象其中保存其所有父类的静态ID对象的指针,这样可以构成了一棵和继承树相同的RTTI树。然后可以通过回溯的方法检查所有父类的ID。这样就可以实现自己的RTTI了。
    下面是自己实现RTTI的代码:

这样只需要在需要RTTI类的声明中加上RTTI_DECLARE宏,并在实现中根据基类的数量加上对象的RTTI_X_BASE_CLASS_IMPLEMENT宏就可以了,例如: 
  .h file:

    .cpp file

    这样就可以对A,B,C类的对象进行运行时的RTTI判断了。
   注意在上面RTTI对象使用了一个固定长度的数组(8个)来保存所有直接父类的RTTI对象。这里其实可以使用多态实现对任意多数目直接父类的支持,但考虑到效率以及设计上的问题,在这里做出了8个直接父类的限制。
   应该是用不完的,因为只要需要RTTI判断的直接父类多于8个才不支持(如果不需要对某个父类的RTTI判断可以不写进RTTI_X_BASE_CLASS_IMPLEMENT宏中,这样还可以避免不需要的查找开销,这又多了一层自我控制的选择)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值