Ç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_DYNCREATE
veya 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
sınıfı için burada gösterildiği gibi sınıfın
CObject
adı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
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
CObject
Sınıf Türetme makalesinde açıklanan DECLARE_DYNAMIC veIMPLEMENT_DYNAMIC
,DECLARE_DYNCREATE
veIMPLEMENT_DYNCREATE
veyaDECLARE_SERIAL
veIMPLEMENT_SERIAL
makrolarını kullanmalıdır.IsKindOf
Burada gösterildiği gibi bağımsız değişkeni oluşturmak için makroyuRUNTIME_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.