接上一篇:MFC关键技术模拟(3)------RTTI。
在上一篇RTTI里面已经实现了类型识别链表。在它的基础上再来实现类型的识别就相对比较容易了。
所有类的继承图表:
1.IsKindOf()函数的实现
在CObject类里面添加一个IsKindOf()函数。因为CObject类是所有类的根源。那么这个CObject类就会被继承到各个子类中。在IsKindOf()函数中比对传入的参数类是否和当前类一致就可以识别这个类的型别了。添加的IsKindOf()函数如下:
BOOL IsKindOf(const CRuntimeClass *pClass) const
{
CRuntimeClass* pClassThis = GetRuntimeClass(); //获取当前类的CRuntimeClass对象指针
while(pClassThis != NULL) //当前类的CRuntimeClass指针不为空
{
if(pClassThis == pClass)//比较参数所指类的CRuntimeClass对象指针是否和当前类CRuntimeClass对象指针一致
{
return TRUE; //一致时返回TRUE
}
pClassThis = pClassThis->m_pBaseClass; //当前类指针指向其基类,循环再做比较
}
return FALSE; //直至其基类再没有任何的基类
}
2.IsKindOf()函数的调用
要识别出某个类的类型,直接调用IsKindOf()函数就可以了。在main函数中声明一个CMyDoc的对象指针,然后按照类的继承图表依次检查类型。
CMyDoc* pMyDoc = new CMyDoc;
cout<<"CObject\t\t"<<pMyDoc->IsKindOf(RUNTIME_CLASS(CObject))<<endl;
cout<<"CCmdTarget\t"<<pMyDoc->IsKindOf(RUNTIME_CLASS(CCmdTarget))<<endl;
cout<<"CWinThread\t"<<pMyDoc->IsKindOf(RUNTIME_CLASS(CWinThread))<<endl;
cout<<"CWinApp\t\t"<<pMyDoc->IsKindOf(RUNTIME_CLASS(CWinApp))<<endl;
cout<<"CMyWinApp\t"<<pMyDoc->IsKindOf(RUNTIME_CLASS(CMyWinApp))<<endl;
cout<<"CWnd\t\t"<<pMyDoc->IsKindOf(RUNTIME_CLASS(CWnd))<<endl;
cout<<"CView\t\t"<<pMyDoc->IsKindOf(RUNTIME_CLASS(CView))<<endl;
cout<<"CMyView\t\t"<<pMyDoc->IsKindOf(RUNTIME_CLASS(CMyView))<<endl;
cout<<"CFrameWnd\t"<<pMyDoc->IsKindOf(RUNTIME_CLASS(CFrameWnd))<<endl;
cout<<"CMyFrameWnd\t"<<pMyDoc->IsKindOf(RUNTIME_CLASS(CMyFrameWnd))<<endl;
cout<<"CDocument\t"<<pMyDoc->IsKindOf(RUNTIME_CLASS(CDocument))<<endl;
cout<<"CMyDoc\t\t"<<pMyDoc->IsKindOf(RUNTIME_CLASS(CMyDoc))<<endl;
程序运行结果:
比对类的继承图表,由于CMyDoc类继承的是CDocument类,CDocument类继承CCmdTarget类,CCmdTarget类继承CObject类。所以结果显示是这样。
3.调试中的问题
你在程序编译时如果出现无法打开写入exe,可以查看是否程序结果正在运行,在进程中杀死它即可。如果进程中没有运行,有可能是杀毒软件在作怪。关闭杀毒软件,然后编译运行,或者重启后关闭杀毒软件再编译运行。