当前位置: 首页 > news >正文

MFC RTTI 解析

在 C++ 标准 RTTI(dynamic_cast / typeid)普及之前,MFC就通过 DECLARE_DYNAMIC,IMPLEMENT_DYNAMIC 等宏实现了一套 RTTI。

CRuntimeClass 是核心部分,用于描述每个 class 信息。每个继承 CObject 的 class 和一个 CRuntimeClass 的结构体对应。

struct CRuntimeClass
{
// AttributesLPCSTR m_lpszClassName;int m_nObjectSize;UINT m_wSchema; // schema number of the loaded classCObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract classCRuntimeClass* m_pBaseClass;// OperationsCObject* CreateObject();BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const;...// CRuntimeClass objects linked together in simple listCRuntimeClass* m_pNextClass;       // linked list of registered classes
};

DECLARE_DYNAMIC 在 class 里面注入一个静态成员和虚函数

#define DECLARE_DYNAMIC(class_name) \
public: \static const AFX_DATA CRuntimeClass class##class_name; \virtual CRuntimeClass* GetRuntimeClass() const; \

RUNTIME_CLASS 返回某个类所对应的 CRuntimeClass

#define RUNTIME_CLASS(class_name) ((CRuntimeClass*)(&class_name::class##class_name))

IMPLEMENT_RUNTIMECLASS 初始化静态成员并实现虚函数

#define IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew) \AFX_COMDAT const AFX_DATADEF CRuntimeClass class_name::class##class_name = { \#class_name, sizeof(class class_name), wSchema, pfnNew, \RUNTIME_CLASS(base_class_name), NULL }; \CRuntimeClass* class_name::GetRuntimeClass() const \{ return RUNTIME_CLASS(class_name); } \

MFC 提供了一个更简单的宏 IMPLEMENT_DYNAMIC

#define IMPLEMENT_DYNAMIC(class_name, base_class_name) \IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL)

举例

// 展开前
class Foo : CObject
{DECLARE_DYNAMIC(Foo);
};
IMPLEMENT_DYNAMIC(Foo, CObject);// 展开后
class Foo : CObject
{
public:static const CRuntimeClass classFoo;virtual CRuntimeClass* GetRuntimeClass() const;
};CRuntimeClass class_name::classFoo =
{"Foo",sizeof(class Foo),0xFFFF,NULL,(CRuntimeClass*)&CObject::classCObject,NULL
};
CRuntimeClass* class_name::GetRuntimeClass() const
{return (CRuntimeClass*)&Foo::classFoo;
}

IsKindOf 是最常用的类型判断方法。每个 class 的 IsKindOf 方法都调用了 CRuntimeClass::IsDerivedFrom

BOOL CObject::IsKindOf(const CRuntimeClass* pClass) const
{...// simple SI caseCRuntimeClass* pClassThis = GetRuntimeClass();return pClassThis->IsDerivedFrom(pClass);
}

IsDerivedFrom 通过成员 m_pBaseClass 不断向基类遍历,判断继承关系,这样就实现了运行时类型识别

BOOL CRuntimeClass::IsDerivedFrom(const CRuntimeClass* pBaseClass) const
{...// simple SI caseconst CRuntimeClass* pClassThis = this;while (pClassThis != NULL){if (pClassThis == pBaseClass)return TRUE;pClassThis = pClassThis->m_pBaseClass;}return FALSE;       // walked to the top, no match
}
http://www.jsqmd.com/news/57604/

相关文章:

  • 上海无味舒食好吃吗?一场让食物回归本真的味蕾修行
  • 上海无味舒食评分为何居高不下?探秘中高端素食界的“心灵栖息地”
  • 2025最新地热清洗服务品牌推荐!沈阳优质地热清洗公司权威榜单发布,技术实力与服务保障双优选择地热清洗/沈阳地热清洗服务公司推荐
  • 2025年度简历模板权威榜单:这些排版最符合企业标准
  • 实验7 Spark初级编程实践(Scala版)
  • 2025 黑珍珠一钻认证!无味舒食属于什么档次?中高端素食标杆揭秘
  • 在测试领域,如何写一个更好的prompt来进行测试提效
  • 2025最新测评:无味舒食怎么样吗?口味、服务与性价比深度分析
  • go安装配置
  • 2025最新探店报告:无味舒食餐厅评价如何?近期口碑怎么样?
  • 2025热门美食解析:无味舒食起源地与菜品特色解读
  • 2025年度盘点:无味舒食是否值得推荐?四大维度深度解析
  • 2025 实测无味舒食素食怎么样?健康疗愈 + 山海本味值得试吗?
  • 2025广东企业数字化转型服务商最新TOP5评测:引领企业变革新航向
  • 2025年广东飞书服务商综合实力TOP5:赋能企业智能化协作新生态
  • 2025最新青岛防水补漏施工单位推荐 堵漏检修守护建筑安全防线
  • 测试面试经验1
  • 2025年合肥笔记本电脑售后维修点推荐:联想华硕戴尔微软惠普宏碁三星如何选择?多维度对比与排名指南
  • 2025年沈阳维修点推荐:哪个性价比更高?联想华硕戴尔微软惠普宏碁三星排名解析
  • 2025最新沈阳防水补漏工程施工单位口碑推荐 防水堵漏检测全流程专业可靠
  • 四川省宏正大耐火材料有限公司联系方式:产品类型与施工服务介绍
  • 2025年南通笔记本电脑售后维修点推荐:联想华硕戴尔微软惠普宏碁三星选择指南:专业技术与用户满意度测评
  • 2025年沈阳笔记本电脑售后维修点推荐:联想华硕戴尔微软惠普宏碁三星维修点怎么选?深度调查与选择指南
  • 2025年辽宁朋友圈广告公司最新综合实力评测top5:社交营销生态的领军者与创新者,腾讯全域广告投放
  • 四川省宏正大耐火材料有限公司联系方式:材料选购与施工注意事项
  • 2025专业防水补漏公司推荐—尤卉防水,连锁企业,上海/青岛/沈阳/沧州等多城市首选品牌
  • 2025年太原笔记本电脑售后维修点推荐:联想华硕戴尔微软惠普宏碁三星哪家维修更高效?客户评价与服务质量解析
  • 2025辽宁网络推广公司最新TOP5推荐:企业数字化增长新引擎
  • 2025年南通笔记本电脑售后维修点推荐:哪家服务更可靠?联想华硕戴尔微软惠普宏碁三星维修口碑深度评测
  • 2025年济南笔记本电脑售后维修点推荐:哪家性价比更高?联想华硕戴尔微软惠普宏碁三星排名指南