design custom dynamic_cast
原文链接 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);