用类静态函数指针实现的RTTI

oo中的优质代码,单例模式、类的静态函数指针实现RTTI
本人对其进行裁剪,简单直接代码展现,把5个函数用宏的形式封装,便于插进代码中使用


typedef void* (*TypeId)();

#define TYPEINFO() \
    static void*  CreateType() { return 0; } \
    static TypeId StaticType() { return &CreateType; } \
    virtual TypeId Type() const { return &CreateType; } \
    static bool IsOf( TypeId aSameOrSuperType ) \
    { \
        if ( aSameOrSuperType == StaticType() ) \
            return true; \
        return false; \
    } \
    virtual bool   IsA( TypeId aSameOrSuperType ) const \
    { return IsOf( aSameOrSuperType ); }

#define TYPE(sType) (sType::StaticType())

#define PTR_CAST( T, pObj ) \
        ( pObj && (pObj)->IsA( TYPE(T) ) ? (T*)(pObj) : 0 )

#define HAS_BASE( T, pObj ) \
        ( pObj && (pObj)->IsA( TYPE(T) ) )

#define IS_TYPE(T,pObj) \
        ( pObj && (pObj)->Type() == TYPE(T) )
使用方法,如下 IS_TYPE()用于判定是否该类型,PTR_CAST()进行动态类型转换
class Base
{
public:
    TYPEINFO();
};

class Derived : public Base
{
public:
    TYPEINFO();
};
	//测试用例
	Base *pbase1 = new Base;
	Base *pbase2 = new Derived;

	cout << IS_TYPE(Base,pbase1) << endl;		//1
	cout << IS_TYPE(Derived,pbase1) << endl;	//0

	Base *pbase3 = new Base;
	Derived *pderived3 = PTR_CAST(Derived,pbase3); //faild NULL
	Base *pbase4 = new Derived;
	Derived *pderived4 = PTR_CAST(Derived,pbase4); //successful

我们让问题复杂一点,再添加一个派生类时


class DDerived : public Derived
{
public:
    TYPEINFO();
};
	//复杂一点的测试用例
	Derived *pderived5 = new DDerived;
	Base *pbase5 = pderived5;
	Derived *pbase6 = PTR_CAST(Derived,pbase5); //faild, return NULL

但是这个时候,我们并不希望转换失败,因为这个转换根本没有任何问题!
缺少的仅仅是DDerived到Derived转换的支持
解决方法是,在IsOf添加一次判定SuperType,让其成功转换
具体实现可以用宏,再插入IsOf中间

#define SUPERTYPE(sSuper) \
            if ( sSuper::IsOf(aSameOrSuperType ) ) \
                return true

其完整代码,不再赘述
oo代码简单、高效,实为我辈范例!

本文参考Oo的RTTI:http://hg.services.openoffice.org/cws/sw34bf06/file/12fa3ee3d107/tools/inc/tools/rtti.hxx

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值