Aracılığıyla paylaş


Çalışma Süresi Sınıf Bilgilerine Erişme

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

Dekont

MFC, Visual C++ 4.0'da sunulan Çalışma Zamanı Tür Bilgileri (RTTI) desteğini kullanmaz.

Sınıfınızı CObject'ten türetdiyseniz ve CObject'ten Sınıf Türetme makalesinde açıklanan DECLARE_DYNAMIC ve IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE ve IMPLEMENT_DYNCREATEveya DECLARE_SERIAL ve IMPLEMENT_SERIAL 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şkeniIsKindOf, sınıfın adıyla makroyu RUNTIME_CLASS kullanarak alabileceğiniz bir CRuntimeClass nesnedir.

RUNTIME_CLASS makroyu kullanmak için

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

    CRuntimeClass *pClass = RUNTIME_CLASS(CObject);
    

Çalışma zamanı sınıf nesnesine doğrudan erişmeniz nadiren gerekir. Daha yaygın bir kullanım, sonraki yordamda gösterildiği gibi çalışma zamanı sınıf nesnesini IsKindOf işleve geçirmektir. İş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ı sınıfı desteğine sahip olduğundan emin olun. Başka bir ifadeyle, sınıfı doğrudan veya dolaylı olarak türetilmiş olmalı ve CObject'ten CObjectSınıf Türetme makalesinde açıklanan DECLARE_DYNAMIC ve IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE ve IMPLEMENT_DYNCREATEveya DECLARE_SERIAL ve IMPLEMENT_SERIAL makrolarını kullanmalıdır.

  2. IsKindOf Burada gösterildiği gibi bağımsız değişkeni oluşturmak için makroyu RUNTIME_CLASS kullanarak bu sınıfın nesneleri için üye işlevini çağırınCRuntimeClass:

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

    Dekont

    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 bkz.

CObject Kullanma