design custom dynamic_cast

2015-07-10 刘太华 更多博文 » 博客 » GitHub »

cpp dynamic_cast design mod

原文链接 https://liutaihua.github.io/2015/07/10/design-custom-dynamic_cast.html
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


一个自定的dynamic_cast设计

一个运行时检查的自设计dynamic_cast转换系统:

  • 包含2个预编译宏,CnDeclareRootRTTI 和CnDeclareRTTI, 宏的目的只是为了生成对应的代码, 实际手法和直接在类里码代码是一样意思;
  • 一个简单的RTTI类型,每个基类和派生类将会自带一个RTTI的实例属性: ms_RTTI, RTTI类如下: {% highlight c++ %} class CnRTTI { public: CnRTTI (const char* pcName, const CnRTTI* pkBaseRTTI); inline const char* GetName() const {return m_pcName;} inline const CnRTTI* GetBaseRTTI() const {return m_pkBaseRTTI;}

protected: const char* m_pcName; const CnRTTI* m_pkBaseRTTI; }; {% endhighlight %} 直接上脑图, 文字真是描述好费劲。

RTTI

自定义的dynamic_cast是:

{% highlight c++ %}

define MyDynamic_cast(classname, pkObject) \

(static_cast<classname*>(classname::DynamicCast(&classname::ms_RTTI, pkObject)))

{% endhighlight %} 使用 Creature* ca = MyDynamic_cast(Creature, pMonster_A);