MFC-CObject关于运行时识别

运行时识别,CObject类的又一个重要特性.

在前面关于CObject的介绍中,我们知道AFX_CLASSINIT这一方法对于运行时识别起到了至关重要的作用.代码如下(出自objcore.cpp):

struct AFX_CLASSINIT
 { AFX_CLASSINIT(CRuntimeClass* pNewClass) { AfxClassInit(pNewClass); } };

 

void AFXAPI AfxClassInit(CRuntimeClass* pNewClass)
{
 AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
 AfxLockGlobals(CRIT_RUNTIMECLASSLIST);
 pModuleState->m_classList.AddHead(pNewClass);
 AfxUnlockGlobals(CRIT_RUNTIMECLASSLIST);
}

 

经过IMPLEMENT_DYNAMIC的替换后,如:

AFX_DATADEF CRuntimeClass CCmdTarget::classCCmdTarget={

"CCmdTarget",sizeof(CCmdTarget),0xFFFF,NULL,RUNTIME_CLASS(CObject),NULL};

 

在这里可以大概理解为在MFC中存在着一个以CObject为根节点的CRuntimeClass链表,CObject->m_pNextClass为CCmdTarget

 

另外从IsKindOf这一函数的源代码也可以看到这一链表的存在及作用

 

BOOL CObject::IsKindOf(const CRuntimeClass *pClass) const

{

     CRuntimeClass *pClassThis=GetRuntimeClass();

     while(pClassThis != NULL)

     {//如果当前类型不匹配,则继续搜索该类型的父类

         if(pClassThis==pClass)

             return TRUE;

         pClassThis = pClassThis->m_pBaseClass;   

     }

     return FALSE;

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值