MFC 学习笔记( 五 )

运行时类信息机制:在程序运行过程中可以获知对象的类的相关信息(例如:对象是否属于某个类)
使用:

MFC 学习笔记

文章插图
代码:
#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的数据结构:
MFC 学习笔记

文章插图
宏展开各部分:
MFC 学习笔记

文章插图

MFC 学习笔记

文章插图
执行过程:
关注这个宏 RUNTIME_CLASS(CDog)
MFC 学习笔记

文章插图
伪代码:
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;}}动态创建机制:在不知道类名的情况下,将类的对象创建出来 。
使用:
MFC 学习笔记

文章插图
#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;}与运行时类信息机制区别:
MFC 学习笔记

文章插图

MFC 学习笔记

文章插图
代码:
RUNTIME_CLASS(CDog)->CreateObject()//函数内部this为本类(CDog)的静态变量地址(链表头{CObject* pObject = (*m_pfnCreateObject)() //CDog::CreateObject{return new CDog;}return pObject;}五.MFC视图和文档视图窗口:提供了一个用于显示数据的窗口

经验总结扩展阅读