Run-Time Sınıf Bilgilerine Erişme

Uyarı

Microsoft Foundation Sınıfları (MFC) kitaplığı desteklenmeye devam ediyor. Ancak artık özellik eklemeyeceğiz veya belgeleri güncelleştirmeyeceğiz.

Bu makalede, çalışma zamanında bir nesnenin sınıfı hakkındaki bilgilere nasıl eriştiği açıklanır.

Uyarı

MFC, Visual C++ 4.0'da sunulan Run-Time Tür Bilgileri (RTTI) desteğini kullanmaz.

Sınıfınızı CObject'ten türetdiyseniz ve CObject'tenSınıf Türetme makalesinde açıklanan DECLARE_IMPLEMENT_DYNAMIC ve DECLARE_DYNCREATE, IMPLEMENT_DYNCREATE ve DECLARE_SERIALveya IMPLEMENT_SERIAL ve makrolarını kullandıysanız, sınıfın CObject çalışma zamanında nesnenin tam sınıfını belirleme yeteneği vardır.

Bu özellik en çok işlev bağımsız değişkenlerinin ek tür denetimi gerektiğinde ve bir nesnenin sınıfına göre özel amaçlı kod yazmanız gerektiğinde kullanışlıdır. Ancak, bu uygulama genellikle sanal işlevlerin işlevselliğini çoğalttığı için önerilmez.

CObject Üye işleviIsKindOf, belirli bir nesnenin belirli bir sınıfa ait olup olmadığını veya belirli bir sınıftan türetilip türetilmediğini belirlemek için kullanılabilir. Bağımsız değişken IsKindOf, sınıfın adıyla CRuntimeClass makroyu kullanarak alabileceğiniz bir RUNTIME_CLASS nesnesidir.

RUNTIME_CLASS makroyu kullanmak için

  1. sınıfı için burada gösterildiği gibi sınıfın RUNTIME_CLASSadıyla kullanınCObject:

    CRuntimeClass *pClass = RUNTIME_CLASS(CObject);
    

Çalışma zamanı sınıf nesnesine doğrudan erişmeniz nadiren gerekir. Daha yaygın bir kullanım, bir sonraki işlem adımında gösterildiği gibi çalışma zamanı sınıf nesnesini IsKindOf fonksiyonuna iletmektir. İşlev, IsKindOf belirli bir sınıfa ait olup olmadığını görmek için bir nesneyi test eder.

IsKindOf işlevini kullanmak için

  1. Sınıfın çalışma zamanı desteğine sahip olduğundan emin olun. Başka bir ifadeyle, sınıfı doğrudan veya dolaylı olarak türetilmiş olmalı ve CObject Sınıf Türetme makalesinde açıklanan DECLARE_IMPLEMENT_DYNAMIC ve DECLARE_DYNCREATE, IMPLEMENT_DYNCREATE ve DECLARE_SERIALveya IMPLEMENT_SERIAL ve makrolarını kullanmalıdır.

  2. Bu sınıfın nesneleri için, burada gösterildiği gibi IsKindOf bağımsız değişkenini oluşturmak amacıyla RUNTIME_CLASS makrosunu kullanarak CRuntimeClass üye işlevini çağırın:

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

    Uyarı

    IsKindOf, nesne belirtilen sınıfın veya belirtilen sınıftan türetilmiş bir sınıfın üyesiyse TRUE döndürür. IsKindOf birden çok devralmayı veya sanal temel sınıfı desteklemez, ancak gerekirse türetilmiş Microsoft Foundation sınıflarınız için birden çok devralma kullanabilirsiniz.

Çalışma zamanı sınıf bilgilerinin bir kullanımı, nesnelerin dinamik olarak oluşturulmasıdır. Bu işlem Dinamik Nesne Oluşturma makalesinde ele alınılmaktadır.

Serileştirme ve çalışma zamanı sınıf bilgileri hakkında daha ayrıntılı bilgi için MFC ve Serileştirme'deki dosyalar makalelerine bakın.

Ayrıca bakınız

CObject Kullanma