在CObject中添加一个IsKindOf函数,此函数将被所有的类继承,它把参数所指定的某个CRuntimeClass对象拿来与类别型录中的元素一一比较。比较成功(在型录中有发现)就传回TRUE,否则就返回FALSE。
//in head file
class CObject
{
public:
...cpp
BOOL IsKindOf(const CRuntimeClass* pClass) const //常量指针
{
CRuntimeClass* pClassThis=GetRuntimeClass();//虚函数,调用的是pClass所指地址的虚函数
while(pClassThis!=NULL)
{
if(pClassThis==pClass)
return TRUE;
pClassThis=pClass->m_pBaseClass;//基类的指针是在IMPLEMENT_DYNAMIC过程中赋值的
}
return FALSE;
}
假定调用
CView * pView=new CView;
pView->IsKindOf(RUNTIME_CLASS(CWinApp));
IsKindOf(RUNTIME_CLASS(&CWinApp::classCWinApp)) const
{
pClassThis=&CView::classCView //此处调用的是CView中的IsKindOf,取得要比较形参的地址
while(pClassThis!=NULL)
{
if(&CView::classCView==(&CWinApp::classCWinApp)//比较两者的地址是否相同
return TRUE; //退出函数
pClassThis=&CWinThread::classCWinThread; //因为CObject的基类为NULL,故此循环总能退出
}
一次比较基类,每获得一个CRuntimeclass对象指针,就拿来和CView::classCView的指针比较。通过这个方法来实现IsKindOf()