WEB开发网
开发学院软件开发VC MFC教程(3)-- CObject类 阅读

MFC教程(3)-- CObject类

 2010-03-25 20:33:52 来源:WEB开发网   
核心提示:成员函数IsDerivedFrom该函数用来帮助运行时判定一个类是否派生于另一个类,被CObject的成员函数IsKindOf函数所调用,MFC教程(3)-- CObject类(8),其实现描述如下:如果定义了_AFXDLL则,成员函数IsDerivedFrom调用成员函数m_pfnGetBaseClass指向的函数来

成员函数IsDerivedFrom

该函数用来帮助运行时判定一个类是否派生于另一个类,被CObject的成员函数IsKindOf函数所调用。其实现描述如下:

如果定义了_AFXDLL则,成员函数IsDerivedFrom调用成员函数m_pfnGetBaseClass指向的函数来向上逐层得到基类的CRuntimeClass类型的静态成员变量,直到某个基类的CRuntimeClass类型的静态成员变量和参数指定的CRuntimeClass变量一致或者追寻到最上层为止。

如果没有定义_AFXDLL,则使用成员变量m_pBaseClass基类的CRuntimeClass类型的静态成员变量。

程序如下所示:

BOOL CRuntimeClass::IsDerivedFrom(

const CRuntimeClass* pBaseClass) const

{

ASSERT(this != NULL);

ASSERT(AfxIsValidAddress(this, sizeof(CRuntimeClass), FALSE));

ASSERT(pBaseClass != NULL);

ASSERT(AfxIsValidAddress(pBaseClass, sizeof(CRuntimeClass), FALSE));

// simple SI case

const CRuntimeClass* pClassThis = this;

while (pClassThis != NULL)//从本类开始向上逐个基类搜索

{

if (pClassThis == pBaseClass)//若是参数指定的类信息

return TRUE;

//类信息不符合,继续向基类搜索

#ifdef _AFXDLL

pClassThis = (*pClassThis->m_pfnGetBaseClass)();

#else

pClassThis = pClassThis->m_pBaseClass;

#endif

}

return FALSE; // 搜索完毕,没有匹配,返回FALSE。

}

由于CRuntimeClass类型的成员变量是静态成员变量,所以如果两个类的CruntimeClass成员变量相同,必定是同一个类。这就是IsDerivedFrom和IsKindOf的实现基础。

上一页  3 4 5 6 7 8 9 10  下一页

Tags:MFC 教程 CObject

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接