Udostępnij za pośrednictwem


Uzyskiwanie dostępu do informacji o klasie czasu wykonywania

W tym artykule wyjaśniono, jak uzyskać dostęp do informacji o klasie obiektu w czasie wykonywania.

Uwaga

MFC nie używa obsługi informacji o typie czasu wykonywania (RTTI) wprowadzonej w programie Visual C++ 4.0.

Jeśli klasa została utworzona na podstawie obiektu CObject i użyta funkcji DECLARE_DYNAMIC i , DECLARE_DYNCREATE IMPLEMENT_DYNCREATEoraz IMPLEMENT_DYNAMIC, lub IMPLEMENT_SERIAL DECLARE_SERIAL makr i wyjaśnione w artykule Wyprowadzanie klasy z obiektu CObject, CObject klasa ma możliwość określenia dokładnej klasy obiektu w czasie wykonywania.

Ta możliwość jest najbardziej przydatna, gdy potrzebne jest dodatkowe sprawdzanie typów argumentów funkcji i kiedy trzeba napisać kod specjalnego przeznaczenia na podstawie klasy obiektu. Jednak ta praktyka nie jest zwykle zalecana, ponieważ duplikuje funkcjonalność funkcji wirtualnych.

Funkcja CObject IsKindOf składowa może służyć do określenia, czy określony obiekt należy do określonej klasy, czy też pochodzi z określonej klasy. Argumentem CRuntimeClass do IsKindOf jest obiekt, który można uzyskać za pomocą RUNTIME_CLASS makra o nazwie klasy.

Aby użyć makra RUNTIME_CLASS

  1. Użyj RUNTIME_CLASS z nazwą klasy , jak pokazano tutaj dla klasy CObject:

    CRuntimeClass *pClass = RUNTIME_CLASS(CObject);
    

Rzadko trzeba bezpośrednio uzyskać dostęp do obiektu klasy czasu wykonywania. Bardziej typowym zastosowaniem jest przekazanie obiektu klasy czasu wykonywania do IsKindOf funkcji, jak pokazano w następnej procedurze. Funkcja IsKindOf testuje obiekt, aby sprawdzić, czy należy do określonej klasy.

Aby użyć funkcji IsKindOf

  1. Upewnij się, że klasa ma obsługę klas uruchomieniowych. Oznacza to, że klasa musi pochodzić bezpośrednio lub pośrednio z i używać deklaracji DECLARE_DYNAMIC i , IMPLEMENT_DYNCREATEDECLARE_DYNCREATE i IMPLEMENT_DYNAMIC, lub DECLARE_SERIAL makr i IMPLEMENT_SERIAL wyjaśnione w artykule Wyprowadzanie klasy z obiektu CObject.CObject

  2. Wywołaj IsKindOf funkcję składową dla obiektów tej klasy, używając makra RUNTIME_CLASS do wygenerowania argumentu CRuntimeClass , jak pokazano poniżej:

    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;
    }
    

    Uwaga

    IsKindOf zwraca wartość TRUE , jeśli obiekt należy do określonej klasy lub klasy pochodzącej z określonej klasy. IsKindOf nie obsługuje wielu dziedziczenia ani wirtualnych klas bazowych, chociaż w razie potrzeby można użyć wielu dziedziczenia dla klas pochodnych programu Microsoft Foundation.

Jednym z zastosowań informacji o klasie czasu wykonywania jest dynamiczne tworzenie obiektów. Ten proces został omówiony w artykule Tworzenie obiektu dynamicznego.

Aby uzyskać bardziej szczegółowe informacje na temat serializacji i klasy czasu wykonywania, zobacz artykuły Pliki w MFC i Serializacja.

Zobacz też

Używanie obiektu CObject