运行时类信息机制:在程序运行过程中可以获知对象的类的相关信息(例如:对象是否属于某个类)
使用:
文章插图
代码:
#include <afxwin.h>#include <iostream>using namespace std;class CAnimal : public CObject{ DECLARE_DYNAMIC( CAnimal )};IMPLEMENT_DYNAMIC( CAnimal, CObject )class CDog : public CAnimal{// DECLARE_DYNAMIC( CDog )public: static const CRuntimeClass classCDog; virtual CRuntimeClass* GetRuntimeClass() const;};//IMPLEMENT_DYNAMIC( CDog, CAnimal )//IMPLEMENT_RUNTIMECLASS(CDog, CAnimal, 0xFFFF, NULL, NULL)AFX_COMDAT const CRuntimeClass CDog::classCDog = {"CDog",sizeof(class CDog),0xFFFF,NULL,//RUNTIME_CLASS(CAnimal),((CRuntimeClass*)(&CAnimal::classCAnimal)),NULL,NULL};CRuntimeClass* CDog::GetRuntimeClass() const{// return RUNTIME_CLASS(CDog); return ((CRuntimeClass*)(&CDog::classCDog));}int main(){ CDog yellowdog; if( yellowdog.IsKindOf( RUNTIME_CLASS(CWnd) ) ){cout << "yellowdog is CWnd" << endl; }else{cout << "yellowdog isnot CWnd" << endl; } return 0;}
CRuntimeClass的数据结构:文章插图
宏展开各部分:
文章插图
文章插图
执行过程:
关注这个宏 RUNTIME_CLASS(CDog)
文章插图
伪代码:
yellowdog.IsKindOf( RUNTIME_CLASS(CDog))//函数内部this为&yellowdog,参数为链表头{CRuntimeClass* pClassThis = GetRuntimeClass();//利用&yellowdog调用宏展开虚函数,获取链表头结点return pClassThis->IsDerivedFrom(RUNTIME_CLASS(CDog))//函数内部this为链表头,参数也为链表头{const CRuntimeClass* pClassThis = this;//获取链表头while (pClassThis != NULL){if (pClassThis == RUNTIME_CLASS(CDog))return TRUE;pClassThis = pClassThis->m_pBaseClass;}return FALSE;}}
动态创建机制:在不知道类名的情况下,将类的对象创建出来 。使用:
文章插图
#include <afxwin.h>#include <iostream>using namespace std;class CAnimal : public CObject{ DECLARE_DYNAMIC( CAnimal )};IMPLEMENT_DYNAMIC( CAnimal, CObject )class CDog : public CAnimal{// DECLARE_DYNCREATE( CDog )public: static const CRuntimeClass classCDog; virtual CRuntimeClass* GetRuntimeClass() const; static CObject* PASCAL CreateObject();};//IMPLEMENT_DYNCREATE( CDog, CAnimal )CObject* PASCAL CDog::CreateObject(){ return new CDog;}AFX_COMDAT const CRuntimeClass CDog::classCDog = {"CDog",sizeof(class CDog),0xFFFF,CDog::CreateObject,RUNTIME_CLASS(CAnimal),NULL,NULL};CRuntimeClass* CDog::GetRuntimeClass() const{ return RUNTIME_CLASS(CDog);}int main(){ CObject* pob = RUNTIME_CLASS(CDog)->CreateObject( );//对象加工厂 if( pob ){cout << pob << endl; }else{cout << "对象创建失败" << endl; } return 0;}
与运行时类信息机制区别:文章插图
文章插图
代码:
RUNTIME_CLASS(CDog)->CreateObject()//函数内部this为本类(CDog)的静态变量地址(链表头{CObject* pObject = (*m_pfnCreateObject)() //CDog::CreateObject{return new CDog;}return pObject;}
五.MFC视图和文档视图窗口:提供了一个用于显示数据的窗口
经验总结扩展阅读
- 论文笔记 - SIMILAR: Submodular Information Measures Based Active Learning In Realistic Scenarios
- 上 学习ASP.NET Core Blazor编程系列十——路由
- JVM学习笔记——类加载和字节码技术篇
- shardingsphere-jdbc 水平分表学习记录
- 再推荐几个适合小孩子的英语学习网站
- Agda学习笔记1
- 萌新版 xss学习笔记
- 1 JAVA语言学习-面向对象
- MyBatis笔记03------XXXMapper.xml文件解析
- 一百二十 salesforce零基础学习快去迁移你的代码中的 Alert / Confirm 以及 Prompt吧