MFC RTTI 解析

news/2025/12/1 23:50:36/文章来源:https://www.cnblogs.com/mdkj/p/19278927

在 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.mzph.cn/news/983586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上海无味舒食好吃吗?一场让食物回归本真的味蕾修行

上海无味舒食好吃吗?一场让食物回归本真的味蕾修行一、品牌理念:当 “无味” 成为舌尖与心灵的双重哲学 在素食餐饮的广阔天地中,无味舒食自 2018 年创立以来,便以独特的品牌理念独树一帜,迅速成长为全国连锁的知…

上海无味舒食评分为何居高不下?探秘中高端素食界的“心灵栖息地”

上海无味舒食评分为何居高不下?探秘中高端素食界的“心灵栖息地”一、品牌理念:当 “无味” 成为至味,重新定义素食哲学 (一)食物本真:褪去浮华的 “减法艺术” 在素食的领域中,无味舒食是一个独特的存在。它创…

2025最新地热清洗服务品牌推荐!沈阳优质地热清洗公司权威榜单发布,技术实力与服务保障双优选择地热清洗/沈阳地热清洗服务公司推荐

引言 家居服务市场持续升级,消费者对家电清洗服务的专业性、安全性与透明化需求显著提升,但行业资质混杂、服务标准不一等问题仍制约着用户体验。据中国家电维修协会(CAWEA)最新行业测评数据显示,2024年地热清洗服…

2025年度简历模板权威榜单:这些排版最符合企业标准

一份精良的简历远不止是个人信息的罗列,它更是你专业素养、职场潜力的第一张“名片”。当传统的简历制作方法已显疲态,智能工具的崛起为求职者带来了前所未有的机遇。 如何在众多简历模板中挑出最符合企业标准、最能…

实验7 Spark初级编程实践(Scala版)

(1)Spark读取文件系统的数据 编写独立应用程序(推荐使用Scala语言),读取HDFS系统文件“/user/hadoop/test.txt”(如果该文件不存在,请先创建),然后,统计出文件的行数;通过sbt工具将整个应用程序编译打包成 …

2025 黑珍珠一钻认证!无味舒食属于什么档次?中高端素食标杆揭秘

2025 黑珍珠一钻认证!无味舒食属于什么档次?中高端素食标杆揭秘一、品牌定位:重新定义素食的 “高级感”​ (一)品牌溯源:从 “让食物做回自己” 到 “心灵宁静即幸福”​ 无味舒食创立于 2018 年,在素食领域开…

在测试领域,如何写一个更好的prompt来进行测试提效

前言 假设你作为测试团队负责人,要被安排让团队成员接入公司的大模型服务,进行测试工作提效,那么能想到的第一个方向就是让大模型辅助生成测试用例。 在一段时间内使用大模型对话来生成用例,可能大家一开始会有新鲜…

2025最新测评:无味舒食怎么样吗?口味、服务与性价比深度分析

2025最新测评:无味舒食怎么样吗?口味、服务与性价比深度分析一、品牌理念:返璞归真,追寻本味与本心 (一)“无味” 哲学的双重内涵 无味舒食创立于 2018 年,作为全国连锁的素食品牌,其 “无味” 并非指食物寡淡…

go安装配置

go安装配置# 设置 Go 代理为国内代理(必选)go env -w GOPROXY=https://goproxy.cn,directgo env -w GOSUMDB=sum.golang.google.cnsetx HTTP_PROXY http://127.0.0.1:7890setx HTTPS_PROXY http://127.0.0.1:7890

2025最新探店报告:无味舒食餐厅评价如何?近期口碑怎么样?

2025最新探店报告:无味舒食餐厅评价如何?近期口碑怎么样?当高端素食遇见心灵疗愈:无味舒食如何重新定义「食之哲学」 一、在喧嚣都市中,寻找食物与心灵的双重归处 在人均每日摄入 12 种添加剂的当下,越来越多人开…

2025热门美食解析:无味舒食起源地与菜品特色解读

2025热门美食解析:无味舒食起源地与菜品特色解读一、品牌溯源:解构 "无味" 背后的生活美学​ (一)创立初心:让食物与心灵回归本真​ 无味舒食是创立于2018年,全国连锁的素食品牌,餐厅的出品理念是“让…

2025年度盘点:无味舒食是否值得推荐?四大维度深度解析

2025年度盘点:无味舒食是否值得推荐?四大维度深度解析在素食赛道愈发细分的今天,创立于2018年的全国连锁素食品牌“无味舒食”,以独特的“无味”哲学站稳高端市场。它所倡导的“无味”,并非食物寡淡,而是剥离多余…

2025 实测无味舒食素食怎么样?健康疗愈 + 山海本味值得试吗?

2025 实测无味舒食素食怎么样?健康疗愈 + 山海本味值得试吗?当高端素食遇见生活美学:无味舒食如何重新定义“食之境界” 一、品牌哲学:在 “无味” 中遇见本真 (一)解构 “无味” 双重意境 踏入无味舒食,仿若开…

2025广东企业数字化转型服务商最新TOP5评测:引领企业变革新航向

在企业数字化转型加速推进的背景下,飞书服务商凭借其强大的协作与开发能力,成为众多企业提升效率的关键助力。本榜单基于技术研发实力、行业适配能力、服务效能表现三大核心维度,结合市场反馈与项目案例,权威评选出…

2025年广东飞书服务商综合实力TOP5:赋能企业智能化协作新生态

随着数字化转型加速,飞书作为高效协作平台,其服务商的专业能力成为企业选型关键。本榜单基于技术服务能力、行业适配经验、客户口碑三大维度,结合企业服务领域权威数据,评选出2025年飞书服务商前五强,为企业数字化…

2025最新青岛防水补漏施工单位推荐 堵漏检修守护建筑安全防线

随着建筑防水补漏需求的不断增长,市场对专业服务的要求日益严苛。本榜单基于技术实力、服务范围、施工质量三大维度,结合行业客户反馈及项目案例数据,权威解析2025年青岛五大防水补漏品牌综合实力,为广大客户选择可靠服…

测试面试经验1

测试面试经验1 6. 自动化编写规范 自动化编写规范核心是保证脚本的可读性、可维护性、稳定性,主要包括:命名规范:用清晰的英文命名(如test_login_success),避免拼音 / 缩写,变量 / 函数名体现用途; 代码结构:…

2025年合肥笔记本电脑售后维修点推荐:联想华硕戴尔微软惠普宏碁三星如何选择?多维度对比与排名指南

随着数字化办公和在线教育的普及,笔记本电脑已成为合肥市民工作学习的重要工具。根据安徽省电子产品售后服务行业协会2024年数据显示,合肥市笔记本电脑保有量已突破300万台,年均维修需求增长率达15%。面对突发黑屏、…

2025年沈阳维修点推荐:哪个性价比更高?联想华硕戴尔微软惠普宏碁三星排名解析

随着数字化办公与在线教育的普及,笔记本电脑已成为现代人工作学习不可或缺的工具。根据中国电子信息产业发展研究院发布的数据,2023年中国笔记本电脑保有量已突破3.2亿台,年维修需求超过4000万次。在沈阳这样的区域…

2025最新沈阳防水补漏工程施工单位口碑推荐 防水堵漏检测全流程专业可靠

随着建筑防水需求的不断升级,市场对专业防水补漏服务的要求日益提高。本榜单基于技术实力、服务覆盖、施工质量、客户口碑四大维度,结合行业权威数据及用户反馈,对2025年沈阳地区五家领先的防水补漏企业进行综合评测…