尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

MFC RTTI 解析

MFC RTTI 解析
📅 发布时间:2026/6/19 16:22:22

在 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
}

相关新闻

  • 2025年度简历模板权威榜单:这些排版最符合企业标准
  • 在测试领域,如何写一个更好的prompt来进行测试提效
  • 2025最新测评:无味舒食怎么样吗?口味、服务与性价比深度分析

最新新闻

  • C# 读写INI文件:从编码乱码到跨平台兼容的实战指南
  • 3大技术突破:PaddleOCR如何用AI重塑文档数字化工作流
  • Navicat Mac版终极重置指南:三步实现无限免费试用
  • Anime.js路径动画终极指南:让元素沿着任意轨迹流畅运动
  • BreezySLAM与ROS集成实战:打造完整的机器人SLAM系统
  • 从74LS到74HC:经典逻辑器件系列演进与应用选型指南

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号