CRuntimeClass 結構
衍生自 CObject
的每個類別都與 CRuntimeClass
結構相關聯,您可以在運行時間用來取得物件或其基類的相關信息。
語法
struct CRuntimeClass
成員
公用方法
名稱 | 描述 |
---|---|
CRuntimeClass::CreateObject | 在運行時間建立物件。 |
CRuntimeClass::FromName | 使用熟悉的類別名稱,在運行時間建立 物件。 |
CRuntimeClass::IsDerivedFrom | 判斷類別是否衍生自指定的類別。 |
公用資料成員
名稱 | 描述 |
---|---|
CRuntimeClass::m_lpszClassName | 類別的名稱。 |
CRuntimeClass::m_nObjectSize | 物件大小 (以位元組為單位)。 |
CRuntimeClass::m_pBaseClass | 基類結構的指標 CRuntimeClass 。 |
CRuntimeClass::m_pfnCreateObject | 動態建立 物件的函式指標。 |
CRuntimeClass::m_pfnGetBaseClass | 傳 CRuntimeClass 回 結構(僅適用於動態連結時)。 |
CRuntimeClass::m_wSchema | 類別的架構編號。 |
備註
CRuntimeClass
是結構,因此沒有基類。
當需要額外類型檢查函式自變數時,或在您必須根據 對象的類別撰寫特殊用途程式代碼時,判斷對象的類別的能力很有用。 C++ 語言並不直接支援執行階段類別資訊。
CRuntimeClass
提供有關相關C++物件的資訊,例如基類的指標 CRuntimeClass
,以及相關類別的 ASCII 類別名稱。 這個結構也會實作各種函式,這些函式可用來動態建立物件、使用熟悉的名稱指定物件的類型,以及判斷相關類別是否衍生自特定類別。
如需使用CRuntimeClass
的詳細資訊,請參閱存取運行時間類別資訊一文。
繼承階層架構
CRuntimeClass
需求
標頭: afx.h
CRuntimeClass::CreateObject
呼叫此函式,以在運行時間動態建立指定的類別。
CObject* CreateObject();
static CObject* PASCAL CreateObject(LPCSTR lpszClassName);
static CObject* PASCAL CreateObject(LPCWSTR lpszClassName);
參數
lpszClassName
要建立之類別的熟悉名稱。
傳回值
新建立物件的指標,如果找不到類別名稱,或記憶體不足而無法建立物件,則為 NULL。
備註
衍生自 CObject
的類別可以支持動態建立,這是在運行時間建立指定類別的物件的能力。 例如,檔、檢視和框架類別應該支持動態建立。 如需動態建立和CreateObject
成員的詳細資訊,請參閱 CObject 類別和 CObject 類別:指定功能層級。
範例
請參閱 IsDerivedFrom 的範例。
CRuntimeClass::FromName
呼叫此函式以擷 CRuntimeClass
取與熟悉名稱相關聯的結構。
static CRuntimeClass* PASCAL FromName(LPCSTR lpszClassName);
static CRuntimeClass* PASCAL FromName(LPCWSTR lpszClassName);
參數
lpszClassName
衍生自 CObject
的類別熟悉名稱。
傳回值
物件的指標CRuntimeClass
,對應至傳入 lpszClassName 的名稱。 如果找不到相符的類別名稱,函式會傳回 NULL。
範例
// This example creates an object if CAge is defined.
CRuntimeClass* pClass = CRuntimeClass::FromName(_T("CAge"));
if (pClass == NULL)
{
// not found, display a warning for diagnostic purposes
AfxMessageBox(_T("Warning: CMyClass not defined"));
return NULL;
}
// attempt to create the object with the found CRuntimeClass
CObject* pObject = pClass->CreateObject();
CRuntimeClass::IsDerivedFrom
呼叫此函式,以判斷呼叫類別是否衍生自 pBaseClass 參數中指定的類別。
BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const;
參數
pBaseClass
衍生自 CObject
的類別熟悉名稱。
傳回值
如果呼叫 IsDerivedFrom
的類別衍生自結構為參數的 CRuntimeClass
基類,則為TRUE,否則為 FALSE。
備註
關聯性是由成員類別的「步行」決定,從衍生類別鏈結到頂端。 如果找不到基類的相符專案,則此函式只會傳回 FALSE。
注意
若要使用 CRuntimeClass
結構,您必須在您想要擷取運行時間物件資訊的類別實作中包含IMPLEMENT_DYNAMIC、IMPLEMENT_DYNCREATE或IMPLEMENT_SERIAL 巨集。
如需使用CRuntimeClass
的詳細資訊,請參閱 CObject 類別:存取運行時間類別資訊一文。
範例
// This example creates an object from the run-time class. It only
// creates objects derived from CWnd.
// We only want to create an object derived from CWnd.
if (!pClass->IsDerivedFrom(RUNTIME_CLASS(CWnd)))
{
TRACE(_T("Error; Object %s is not derived from CWnd\n"),
pClass->m_lpszClassName);
return FALSE;
}
// Get a pointer to the base class CRuntimeClass.
#ifdef _AFXDLL
CRuntimeClass* pBaseClass = pClass->m_pfnGetBaseClass();
#else
CRuntimeClass* pBaseClass = pClass->m_pBaseClass;
#endif
ASSERT(pBaseClass != NULL);
TRACE("Creating object %s derived from %s, with object size %d "
"and schema %d\n", pClass->m_lpszClassName,
pBaseClass->m_lpszClassName, pClass->m_nObjectSize,
pClass->m_wSchema);
// Create the object.
CObject* pObject = pClass->CreateObject();
CRuntimeClass::m_lpszClassName
包含 ASCII 類別名稱的 Null 終止字串。
備註
這個名稱可用來使用 FromName
成員函式建立 類別的實例。
範例
請參閱 IsDerivedFrom 的範例。
CRuntimeClass::m_nObjectSize
物件的大小,以位元組為單位。
備註
如果物件具有指向已配置記憶體的數據成員,則不包含該記憶體的大小。
範例
請參閱 IsDerivedFrom 的範例。
CRuntimeClass::m_pBaseClass
如果您的應用程式以靜態方式連結至 MFC,此資料成員會包含基類結構的指標 CRuntimeClass
。
備註
如果您的應用程式動態連結至 MFC 連結庫,請參閱 m_pfnGetBaseClass。
範例
請參閱 IsDerivedFrom 的範例。
CRuntimeClass::m_pfnCreateObject
建立類別物件之預設建構函式的函式指標。
備註
只有當 類別支持動態建立時,這個指標才有效;否則,函式會傳回NULL。
CRuntimeClass::m_pfnGetBaseClass
如果您的應用程式使用 MFC 連結庫做為共用 DLL,此資料成員會指向傳回 CRuntimeClass
基類結構的函式。
備註
如果您的應用程式以靜態方式連結至 MFC 連結庫,請參閱 m_pBaseClass。
範例
請參閱 IsDerivedFrom 的範例。
CRuntimeClass::m_wSchema
架構編號 (不可串行化類別的 -1)。
備註
如需架構編號的詳細資訊,請參閱 IMPLEMENT_SERIAL 巨集。
範例
請參閱 IsDerivedFrom 的範例。
另請參閱
階層架構圖表
CObject::GetRuntimeClass
CObject::IsKindOf
RUNTIME_CLASS
IMPLEMENT_DYNAMIC
IMPLEMENT_DYNCREATE
IMPLEMENT_SERIAL