Доступ к данным среды выполнения класса
В этой статье описывается, как получить доступ к сведениям о классе объекта во время выполнения.
Примечание |
---|
MFC не использует введенную поддержку Сведения о типах во время выполнения (RTTI) в 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 возвращает Истина если объект является членом заданного класса или класса, производного от указанного класса.IsKindOf не поддерживает множественное наследование или виртуальные базовые классы, хотя можно использовать множественное наследование для производных классов Microsoft foundation, если это необходимо.
Одна использование данных о времени выполнения класса в динамическом создании объектов.Этот процесс рассматривается в статье создание динамического объекта.
Дополнительные подробные сведения на данных класса сериализации и среды выполнения, см. статьи файлы в MFC и Сериализация.