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