Поделиться через


Доступ к сведениям о классе во время выполнения

В этой статье объясняется, как получить доступ к сведениям о классе объекта во время выполнения.

Примечание.

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

  1. Используйте RUNTIME_CLASS имя класса, как показано здесь для класса CObject:

    CRuntimeClass *pClass = RUNTIME_CLASS(CObject);
    

Доступ к объекту класса времени выполнения редко требуется напрямую. Чаще всего используется передача объекта класса времени выполнения в IsKindOf функцию, как показано в следующей процедуре. Функция IsKindOf проверяет объект, чтобы узнать, принадлежит ли он конкретному классу.

Использование функции IsKindOf

  1. Убедитесь, что класс поддерживает класс во время выполнения. То есть класс должен быть производным напрямую или косвенно от CObject него и использовался оператор DECLARE_DYNAMIC и IMPLEMENT_DYNAMIC, IMPLEMENT_DYNCREATEDECLARE_DYNCREATE а также DECLARE_SERIAL IMPLEMENT_SERIAL макросы, описанные в статье по производным классу от CObject.

  2. 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 и сериализации.

См. также

Использование CObject