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

MFC RTTI 解析

MFC RTTI 解析
📅 发布时间:2026/7/22 9:03:36

在 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最新测评:无味舒食怎么样吗?口味、服务与性价比深度分析

最新新闻

  • 南通人卖金别乱跑,这5家实体店把高价和透明焊死了 - 新芸鼎珠宝首饰
  • n8n 2.0数据库支持变更与PostgreSQL配置指南
  • YOLO11-C3k2-EMA模型在工程机械检测中的优化与应用
  • MuMu模拟器多端部署与性能优化指南
  • AgentFAIR:基于多智能体的地理空间数据FAIR评估框架实战
  • HTML5时代XSS防御:从基础编码到CSP的纵深安全体系

日新闻

  • AI云原生实战05-金融AI上云最难的不是技术,是“不出事“——TCE银行风控架构拆解
  • 2026年GEOSEO优化公司选型深度测评:五大硬核标准严选,这六家重塑搜索增长新格局 - 品牌前沿专家
  • **核验!2026年7月卡地亚香港**售后网点地址及服务电话公告 - 卡地亚服务中心

周新闻

  • SaaS软件行业GEO实践:AI搜索时代的品牌可见性与获客新路径
  • 什么是PCTFE?医药高端包装的“防潮王牌“材料
  • 【JVM调优实战】16-可视化利器-JConsole-VisualVM-JMC

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

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

服务项目

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

快速链接

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

联系方式

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

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