Gamebryo 引擎的RITI机制

一 什么是RITI

      通过运行时类型识别(RTTI)(Run-Time Type Identification),程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型,在C++中,RITI最大的用处是通过虚函数来实现多态。不过有些时候我们必须在运行时期确切的知道基类指针实际所指的类型,而不是单纯的调用虚函数。
在vc中,RTTI提供了两个非常有用的操作符:
1:typeid操作符,返回指针和引用所指的实际类型。typeid表达式形如:typeid(expr),这里expr是任意表达式或者类型名。如果表达式的类型是类类型且至少包含有一个虚函数,则typeid操作符返回表达式的动态类型,需要在运行时计算;否则,typeid操作符返回表达式的静态类型,在编译时就可以计算。
2:dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用。当dynamic_cast用于基类指针时,该指针必须是有效的——要么是0,要么是指向一个对象。如果绑定到引用或指针的对象不是目标类型的对象,则dynamic_cast失败。如果转换到指针类型的dynamic_cast失败,则dynamic_cast的结果是0值;如果转换到引用类型的dynamic_cast失败,则抛出一个bad_cast类型的异常。因此,dynamic_cast操作符一次执行两个操作:首先验证被请求的转换是否有效,只有当转换有效时才进行实际转换。

 

二 Gamebryo中RITI类的声明和定义

    为了支持多平台,以及提供一个更加安全和有效的RITI,GB实现了自己的RITI机制。在GB中所有具备RITI能力的类都必须继承于IBase接口类,该类不仅提供了RITI接口,而且提供了引用计数的接口。每个继承与Ibase的类可以通过宏来重载RITI函数,在头文件中使用EE_DECLARE_CLASS宏来声明一个RITI类,并在cpp文件中使用EE_IMPLEMENT_CONCRETE_CLASS_INFO来定义。例如我们可以用EE_DECLARE_CLASS1(FinalClass, UniqueID, BaseClass)来声明一个类,第一个参数是类名,第二个是类的ID,这个id是独一无二的,第三个是该类的基类名。另外我们也可以通过EE_DECLARE_INTERFACE来声明一个接口类,我们不用在cpp文件中定义。

 

三 在Gamebryo中使用RITI

ClassID GetClassID() 该函数用来获得类的id。const ClassInfo* GetClassDesc()获得类的详细信息。EE_DYNAMIC_CAST可以用来将基类类型的指针安全地转换为派生类型的指针。EE_IS_KIND_OF(classname, pObject)宏用来判断某个对象是否属于该类或该类的子类。EE_IS_EXACT_KIND_OF(classname, pObject)用来判断某个对象是否属于该类,但比包括该类的子类。

 

 

 

 


  

你可能感兴趣的:(GameBryo)