Posted on 2007-04-06 10:10
kk 閱讀(1364)
評論(0) 編輯 收藏 引用 所屬分類:
IT
CRuntimeClass在MFC中的作用很重要,因為MFC利用它來進行類的動態確定,即是通過類變量來判定該變量是否為某一類的實例。由于指針的類型是可以轉換的,所以時常會出現從A到B的轉換導致錯誤。而在MFC的各種書籍中對CRuntimeClass的介紹是比較少的,在這里總結它的一些用法。
1、動態確定類
在MFC中CObject::IsKindOf( const CRuntimeClass* pClass ) 利用CRuntimeClass來進行判定,如果你生成的類是以CObject為基礎的,你可以使用該成員函數來判定。下面舉一個例子來加深了解。
class CAge:public CObject
BOOL IsAge(CObject* pO)
{
return pO->IsKindOf( RUNTIME_CLASS( CAge ) );
}
BOOL IsAge2(CAge* pO)
{
return pO->IsKindOf( RUNTIME_CLASS( CAge ) );
}
void main(void)
{
CObject a;
CAge b;
IsAge(&a);//return FALSE
IsAge(&b);//return TRUE
IsAge2((CAge*)&a);//return FALSE,避免強制轉換帶來的錯誤
}
2、生成類
CObject CRuntimeClass::CreateObject(void)可以產生一個類變量。作用和new類似,但在某些特殊場合有獨特的作用。下面舉一個例子來加深了解。
假定有以下幾個類定義
class CWndA: public CWnd
class CWndB: public CWnd
function1()
{
CRuntimeClass* pC=RUNTIME_CLASS( CWndA );
CreateWnd(pC);
}
CWnd* CreateWnd(CRuntimeClass* pClass)
{
return (CWnd*)pClass->CreateObject();
}
在上面例子中,CreateWnd返回的是CWnd* 其實它是一個CWndA*。你可以進行由父類到子類的強制轉換而不必要擔心出錯。使用CRuntimeClass可以代替使用switch生產類實例的一些繁瑣。(請好好想想它的用途,當你發現它的好處時,你一定會大吃一驚,M$使用宏來實現類的動態檢測,如果誰有興趣可以去看看MFC的源代碼。)
注意:在類的定義中使用IMPLEMENT_DYNCREATE后方可生效。