Dostęp do informacji Run-Time, klasa
W tym artykule wyjaśniono, jak uzyskać dostęp do informacji dotyczących klasy obiektu w czasie wykonywania.
[!UWAGA]
MFC nie korzysta z Informacji typu Run-Time (RTTI) wsparcie w Visual C++ 4.0.
Jeśli pochodzą z klasy CObject i wykorzystywane DECLARE_dynamiczne i IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE i IMPLEMENT_DYNCREATE, lub DECLARE_SERIAL i IMPLEMENT_SERIAL makra wyjaśnione w artykule wynikających z klasy z 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, na podstawie klasy obiektu.Jednak praktyka ta nie jest zwykle zalecane, ponieważ on duplikatów funkcjonalność funkcje wirtualnych.
CObject Członkowskich funkcji IsKindOf można określić, jeśli dany obiekt należy do określonej klasy lub jest on uzyskiwany z określonej klasy.Argument dla IsKindOf jest CRuntimeClass obiekt, który można uzyskać za pomocą RUNTIME_CLASS makro o nazwie klasy.
Aby użyć makra RUNTIME_CLASS
Użyj RUNTIME_CLASS z nazwą klasy, jak pokazano tutaj klasy CObject:
CRuntimeClass* pClass = RUNTIME_CLASS( CObject );
Rzadko trzeba będzie bezpośredni dostęp do obiektu klasy uruchomieniowej.Więcej wspólnego wykorzystywania jest przekazanie obiektu klasy czasu do IsKindOf działa, jak pokazano w następnej procedurze.IsKindOf Funkcji badania obiektu, jeśli należy on do konkretnej klasy.
Aby użyć funkcji IsKindOf
Upewnij się, że klasa obsługuje klasy uruchomieniowej.Oznacza to, że klasa musi zostały 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 wyjaśnione w artykule wynikających z klasy z 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 , jeśli obiekt jest członkiem określonej klasy lub klasy pochodzącej od określonej klasy.IsKindOfnie obsługuje wielu dziedziczenia lub wirtualne klasy podstawowej, chociaż można używać wielokrotne dziedziczenie dla użytkownika pochodnych Microsoft Foundation classes, w razie potrzeby.
Jeden korzystania z klasy uruchomieniowej informacji jest dynamiczne tworzenie obiektów.Proces ten jest omawiany w artykule Dynamiczne tworzenie obiektu.
Aby uzyskać więcej informacji na temat serializacji i klasy uruchomieniowej informacji, zobacz artykuły pliki w MFC i serializacji.