Çalışma zamanı sınıf bilgilerine erişme
Bu makalede, access çalışma zamanında bir nesnenin sınıf hakkında bilgi açıklar.
Not
mfc kullanmayan Çalışma zamanı tür bilgi (RTTI) desteği Visual C++ 4.0 kullanılmaya başlandı.
Kendi sınıfından türetilmiş durumunda CObject ve declare_dinamik ve IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE ve IMPLEMENT_DYNCREATE, veya DECLARE_SERIAL ve IMPLEMENT_SERIAL makrolar makalesinde açıklandığı CObject sınıfından türeyen, CObject sınıfının zamanında tam bir nesne sınıfını belirleme olanağı vardır.
Bu yeteneği en fazla tür işlev bağımsız değişkenleri denetlemesi gereken ve bir nesne sınıfını esas özel amaçlı kod yazmanız gerekir yararlıdır. Sanal işlevler işlevselliğini çoğaltır ancak bu yöntem genellikle önerilmez çünkü.
CObject Üye işlev IsKindOf belirli bir nesneyi belirtilen sınıfa ait veya özel sınıfından türetilir belirlemek için kullanılır. Bağımsız değişken IsKindOf olan bir CRuntimeClass kullanarak almak nesne RUNTIME_CLASS sınıf adını taşıyan bir makro.
RUNTIME_CLASS makro kullanma
Use RUNTIME_CLASS adıyla sınıfının sınıf için aşağıda gösterildiği gibi CObject:
CRuntimeClass* pClass = RUNTIME_CLASS( CObject );
Nadiren çalıştırma sınıf nesnesi doğrudan erişmek gerekir. Çalışma zamanı sınıf nesnesi geçmesine daha yaygın kullanımı olan IsKindOf bir sonraki yordamda gösterildiği gibi işlev. IsKindOf İşlevi, bir nesnenin belirli bir sınıfa ait olup olmadığını sınar.
IsKindOf işlevi kullanmak için
Sınıf çalıştırma sınıf desteği olduğundan emin olun. Yani sınıf doğrudan veya dolaylı olarak türetilen gerekir CObject ve declare_dinamik ve IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE ve IMPLEMENT_DYNCREATE, veya DECLARE_SERIAL ve IMPLEMENT_SERIAL makrolar makalesinde açıklandığı CObject sınıfından türeyen.
Call IsKindOf üye işlevi, o sınıfın nesneleri için kullanarak RUNTIME_CLASS makro oluşturmak için CRuntimeClass bağımsız değişkeni, aşağıda gösterildiği gibi:
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; }
Not
IsKindOf işlevi doğru nesnesi, belirtilen sınıf veya belirtilen sınıfından türetilmiş bir sınıf üyesi ise.IsKindOfbirden çok devralma gerekirse türetilmiş Microsoft Foundation sınıflarını kullanabilirsiniz, ancak birden çok devralma veya sanal temel sınıfları desteklemez.
Bir çalışma zamanı sınıfı bilgileri nesneleri dinamik oluşturulmasında kullanılır. Bu işlem, makalede açıklanan Dinamik nesne oluşturma.
Makaleleri, daha ayrıntılı çalışma zamanı sınıfı bilgileri ve seri hale getirme hakkında bilgi için bkz: mfc dosyalarında ve seri hale getirme.