Dela via


Åtkomst till Run-Time-klassinformation

Den här artikeln beskriver hur du kommer åt information om klassen för ett objekt under körtid.

Anmärkning

MFC använder inte rtti-stödet ( Run-Time Type Information ) som introducerades i Visual C++ 4.0.

Om du har härlett din klass från CObject och använt makrona DECLARE_DYNAMIC och IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE och IMPLEMENT_DYNCREATE, eller DECLARE_SERIAL och IMPLEMENT_SERIAL som förklaras i artikeln Deriving a Class from CObject, så har klassen möjlighet att fastställa den exakta klassen för ett objekt vid körtid.

Den här möjligheten är mest användbar när extra typkontroll av funktionsargument behövs och när du måste skriva specialkod baserat på klassen för ett objekt. Den här metoden rekommenderas dock vanligtvis inte eftersom den duplicerar funktionerna i virtuella funktioner.

Medlemsfunktionen CObjectIsKindOf kan användas för att avgöra om ett visst objekt tillhör en angiven klass eller om det härleds från en specifik klass. Argumentet till IsKindOf är ett CRuntimeClass objekt som du kan hämta med hjälp RUNTIME_CLASS av makrot med namnet på klassen.

Så här använder du makrot RUNTIME_CLASS

  1. Använd RUNTIME_CLASS med namnet på klassen, som du ser här för klassen CObject:

    CRuntimeClass *pClass = RUNTIME_CLASS(CObject);
    

Du behöver sällan komma åt körningsklassobjektet direkt. En vanligare användning är att skicka körningsklassobjektet till IsKindOf funktionen, som du ser i nästa procedur. Funktionen IsKindOf testar ett objekt för att se om det tillhör en viss klass.

Så här använder du funktionen IsKindOf

  1. Kontrollera att klassen har stöd för körtidsklassstöd. Det vill säga klassen måste ha härletts direkt eller indirekt från CObject och använt DECLARE_DYNAMIC och IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE och IMPLEMENT_DYNCREATE, eller makron DECLARE_SERIALIMPLEMENT_SERIAL som förklaras i artikeln Deriving a Class from CObject.

  2. IsKindOf Anropa medlemsfunktionen för objekt i den klassen med hjälp av makrot RUNTIME_CLASS för att generera CRuntimeClass argumentet, som du ser här:

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

    Anmärkning

    IsKindOf returnerar TRUE om objektet är medlem i den angivna klassen eller en klass som härleds från den angivna klassen. IsKindOf stöder inte flera arvsklasser eller virtuella basklasser, men du kan använda flera arv för dina härledda Microsoft Foundation-klasser om det behövs.

En användning av körtidsklassinformation är i den dynamiska skapelsen av objekt. Den här processen beskrivs i artikeln Dynamiskt objektskapande.

Mer detaljerad information om serialisering och körningsklassinformation finns i artiklarna Filer i MFC och Serialisering.

Se även

Använda CObject