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_DYNCREATE
oraz 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
Użyj
RUNTIME_CLASS
z nazwą klasy , jak pokazano tutaj dla klasyCObject
: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
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_DYNCREATE
DECLARE_DYNCREATE
iIMPLEMENT_DYNAMIC
, lubDECLARE_SERIAL
makr iIMPLEMENT_SERIAL
wyjaśnione w artykule Wyprowadzanie klasy z obiektu CObject.CObject
Wywołaj
IsKindOf
funkcję składową dla obiektów tej klasy, używając makraRUNTIME_CLASS
do wygenerowania argumentuCRuntimeClass
, 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.