作用
在程序运行过程中可以获知对象的类的相关信息:机器知道
运行时类信息机制使用
类必须派生自CObject
类内必须添加声明宏 DECLARE_DYNAMIC(theClass)
类外必须添加实现宏 IMPLEMENT_DYNAMIC(theClass,baseClass)
具备上述要件,CObject::IsKindOF可以正确判断对象是否属于某个类
代码的书写
定义一个A类,派生自CObject,类内外声明宏和实现宏
定义一个B类,派生自A,类内外声明宏和实现宏
#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)
};
IMPLEMENT_DYNAMIC(CDog,CAnimal)
int main() {
CDog yellowdog;
if (yellowdog.IsKindOf(RUNTIME_CLASS(CWnd))){
cout<<"yellowdog is CWnd"<<endl;
}
else {
cout<<"yellowdog is not CWnd"<<endl;
}
return 0;
}
扩展代码
#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),
NULL,
NULL
};
CRuntimeClass* CDog::GetRuntimeClass() const
{
return RUNTIME_CLASS(CDog);
}
int main() {
CDog yellowdog;
if (yellowdog.IsKindOf(RUNTIME_CLASS(CWnd))){
cout<<"yellowdog is CWnd"<<endl;
}
else {
cout<<"yellowdog is not CWnd"<<endl;
}
return 0;
}
struct CRuntimeClass{
LPCSTR m_lpszClassName; //类名称
int m_nObjectSize;//类大小
UINT m_wSchema; // 类版本
CObject* (PASCAL* m_pfnCreateObject)(); // 动态创建机制,这里为空
CRuntimeClass* m_pBaseClass;//父类宏展开静态变量地址
CRuntimeClass* m_pNextClass; //不使用时为空
const AFX_CLASSINIT* m_pClassInit; //不使用时为空
};
宏展开各部分作用
classCDog静态变量:保存为类名、类大小等信息,以及符类静态变量地址(负责连接链表)
GetRuntimeClass 虚函数:获取奔雷的静态变量地址(本类表头)
执行过程
略