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 korzysta z Informacji o typie Run-Time wsparcia (ROBOCZĄ) wprowadzone w Visual C++ 4.0.
Jeśli mieć pochodne klasy z CObject i wykorzystywane DECLARE_dynamiczne i IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE i IMPLEMENT_DYNCREATE, lub DECLARE_SERIAL i IMPLEMENT_SERIAL makra opisano w artykule wynikających z klasy CObject, CObject klasa ma możliwość określenia dokładnej klasy obiektu w czasie wykonywania.
Ta możliwość jest najbardziej użyteczna, gdy potrzebny jest dodatkowy typ sprawdzania argumentów funkcji i kiedy należy napisać kod specjalnych oparte na klasy obiektu.Jednak praktyka ta nie jest zwykle zalecane ponieważ jest ona duplikatem funkcjonalność wirtualnych funkcji.
CObject Funkcji składowej IsKindOf pozwala stwierdzić, czy określony obiekt należy do określonej klasy, albo jeśli wynika to z określonej klasy.Argument IsKindOf jest CRuntimeClass obiekt, który można uzyskać za pomocą RUNTIME_CLASS makro o nazwie klasy.
Aby użyć makra RUNTIME_CLASS
Użycie RUNTIME_CLASS z nazwą klasy, jak pokazano poniżej, dla klasy CObject:
CRuntimeClass* pClass = RUNTIME_CLASS( CObject );
Rzadko trzeba będzie bezpośrednio uzyskać dostępu do obiektu klasy w czasie wykonywania.Bardziej powszechne zastosowanie jest przekazanie wykonywania klasy obiektu do IsKindOf funkcji, jak pokazano w następnej procedurze.IsKindOf Testy wydolności obiekt, aby zobaczyć, czy należy do danej klasy.
Aby użyć funkcji IsKindOf
Upewnij się, że klasa ma wsparcie klasy w czasie wykonywania.Oznacza to klasy musi być uzyskane bezpośrednio lub pośrednio z CObject i wykorzystywane DECLARE_dynamiczne i IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE i IMPLEMENT_DYNCREATE, lub DECLARE_SERIAL i IMPLEMENT_SERIAL makra opisano w artykule wynikających z klasy CObject.
Wywołanie IsKindOf funkcji składowej dla obiektów tej klasy za pomocą RUNTIME_CLASS makro do generowania CRuntimeClass argument, 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]
Zwraca IsKindOf TRUE obiektu będącego członkiem określonej klasy lub klasy pochodzącej od określonej klasy.IsKindOfnie obsługuje wielu dziedziczenia lub wirtualnych klas podstawowych, chociaż w razie potrzeby można użyć wielokrotne dziedziczenie dla swojej klasy pochodne Microsoft Foundation.
Jednym z zastosowań informacji dotyczących wykonywania klas jest dynamicznego tworzenia obiektów.Proces ten jest omawiany w artykule Dynamiczne tworzenie obiektu.
Aby uzyskać szczegółowe informacje na temat serializacji i informacji dotyczących wykonywania klas, zobacz artykuły pliki w bibliotece MFC i serializacji.