一个自定的dynamic_cast设计
一个运行时检查的自设计dynamic_cast转换系统:
- 包含2个预编译宏,CnDeclareRootRTTI 和CnDeclareRTTI, 宏的目的只是为了生成对应的代码, 实际手法和直接在类里码代码是一样意思;
- 一个简单的RTTI类型,每个基类和派生类将会自带一个RTTI的实例属性: ms_RTTI, RTTI类如下:
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;
};
直接上脑图, 文字真是描述好费劲。
RTTI</img>
自定义的dynamic_cast是:
#define MyDynamic_cast(classname, pkObject) \
(static_cast<classname*>(classname::DynamicCast(&classname::ms_RTTI, pkObject)))
使用 Creature* ca = MyDynamic_cast(Creature, pMonster_A);