design custom dynamic_cast

#cpp #dynamic_cast #design mod 编辑

一个自定的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);