Доступ к сведениям о классе во время выполнения
В этой статье объясняется, как получить доступ к сведениям о классе объекта во время выполнения.
Примечание.
MFC не использует поддержку сведений о типах выполнения (RTTI), появилась в Visual C++ 4.0.
Если вы производили класс от CObject и использовали инструкции DECLARE_DYNAMIC и IMPLEMENT_DYNAMIC
, DECLARE_DYNCREATE
IMPLEMENT_DYNCREATE
а также DECLARE_SERIAL
IMPLEMENT_SERIAL
макросы, описанные в статье "Производный класс от CObject", CObject
класс имеет возможность определить точный класс объекта во время выполнения.
Эта возможность наиболее полезна, если требуется проверка дополнительных типов аргументов функций и когда необходимо написать код специального назначения на основе класса объекта. Однако эта практика обычно не рекомендуется, так как она дублирует функциональные возможности виртуальных функций.
CObject
Функцию-член IsKindOf
можно использовать для определения того, принадлежит ли определенный объект указанному классу или является ли он производным от определенного класса. Аргументом IsKindOf
является CRuntimeClass
объект, который можно получить с помощью RUNTIME_CLASS
макроса с именем класса.
Использование макроса RUNTIME_CLASS
Используйте
RUNTIME_CLASS
имя класса, как показано здесь для классаCObject
:CRuntimeClass *pClass = RUNTIME_CLASS(CObject);
Доступ к объекту класса времени выполнения редко требуется напрямую. Чаще всего используется передача объекта класса времени выполнения в IsKindOf
функцию, как показано в следующей процедуре. Функция IsKindOf
проверяет объект, чтобы узнать, принадлежит ли он конкретному классу.
Использование функции IsKindOf
Убедитесь, что класс поддерживает класс во время выполнения. То есть класс должен быть производным напрямую или косвенно от
CObject
него и использовался оператор DECLARE_DYNAMIC иIMPLEMENT_DYNAMIC
,IMPLEMENT_DYNCREATE
DECLARE_DYNCREATE
а такжеDECLARE_SERIAL
IMPLEMENT_SERIAL
макросы, описанные в статье по производным классу от CObject.IsKindOf
Вызовите функцию-член для объектов этого класса, используяRUNTIME_CLASS
макрос для создания аргументаCRuntimeClass
, как показано ниже:class CPerson : public CObject { DECLARE_DYNAMIC(CPerson) // other declarations };
IMPLEMENT_DYNAMIC(CPerson, CObject) IMPLEMENT_DYNCREATE(CMyDynCreateObj, CObject) void MemoryCorruptingSnippet(bool bCorrupt) { if (bCorrupt) { CAge *pcage = new CAge(21); // CAge is derived from CObject. Age *page = new Age(22); // Age is NOT derived from CObject. *(((char *)pcage) - 1) = 99; // Corrupt preceding guard byte *(((char *)page) - 1) = 99; // Corrupt preceding guard byte AfxCheckMemory(); } } void SomeFunction(void) { CObject *pMyObject = new CPerson; if (NULL != pMyObject && pMyObject->IsKindOf(RUNTIME_CLASS(CPerson))) { //if IsKindOf is true, then cast is all right CPerson *pmyPerson = (CPerson *)pMyObject; pmyPerson->AssertValid(); // other code goes here... } delete pMyObject; }
Примечание.
IsKindOf возвращает значение TRUE , если объект является членом указанного класса или класса, производным от указанного класса.
IsKindOf
не поддерживает несколько наследование или виртуальные базовые классы, хотя при необходимости можно использовать несколько наследование для производных классов Microsoft Foundation.
Одним из вариантов использования сведений о классе во время выполнения является динамическое создание объектов. Этот процесс рассматривается в статье "Создание динамических объектов".
Дополнительные сведения о сериализации и классе во время выполнения см. в статьях "Файлы" в MFC и сериализации.