Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье объясняется, как получить доступ к сведениям о классе объекта во время выполнения.
Замечание
MFC не использует поддержку Run-Time type Information (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,DECLARE_DYNCREATEIMPLEMENT_DYNCREATEилиDECLARE_SERIALIMPLEMENT_SERIAL, описанные в статье «Производный класс от CObject».Вызовите функцию-член для объектов этого класса, используя макрос
IsKindOfдля создания аргументаRUNTIME_CLASS, как показано здесь.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 и Сериализация.