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