Доступ к сведениям о классе во время выполнения
В этой статье описывается, как получить сведения о классе объекта во время выполнения.
Примечание
MFC не использует введенную поддержку Данные типа во время выполнения (RTTI) C в Visual C++ 4.0.
Если производного класса из CObject и задан _динамические и IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE и IMPLEMENT_DYNCREATEdeclare или проверки, описанных макросы DECLARE_SERIAL и IMPLEMENT_SERIAL в статье Производный класс от CObject, класс CObject имеет возможность определить точный класс объекта во время выполнения.
Эта возможность особенно полезен, если некоторую проверку типов аргументов функции требуется и когда необходимо написать код одноцелевой на основе класса объекта. Однако такой подход обычно не рекомендуется, поскольку она дублирует функция виртуальных функций.
Функции-члена IsKindOfCObject можно использовать, чтобы определить, совпадает ли указанный объект принадлежит к указанному классу или если он является производным от определенного класса. Аргумент IsKindOf объект CRuntimeClass, можно получить с помощью макроса RUNTIME_CLASS с именем класса.
Использовать макрос RUNTIME_CLASS
Используйте RUNTIME_CLASS с именем класса, как показано ниже для класса CObject:
CRuntimeClass* pClass = RUNTIME_CLASS( CObject );
Для редко бывает необходимо получить объект класса среды выполнения напрямую. Более распространенным применением передать объект класса среды выполнения функции IsKindOf, как показано в следующей процедуре. Функциональных тестов IsKindOf объект, является ли он относится к определенному классу.
Использовать функцию IsKindOf
Убедитесь, что класс поддерживает класса среды выполнения. То есть, класс должен быть производным прямо или косвенно от CObject, _динамические и IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE и IMPLEMENT_DYNCREATEdeclare или проверки, описанных макросы 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 и Сериализация.