访问运行时类的信息

  1. /*
  2.     这篇小短文告诉我们如何在运行时取得一个类对象的信息
  3.     如果你是从类CObject派生的类且还使用了宏DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC,
  4.     DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE或者DECLARE_SERIAL和IMPLEMENT_SERIAL,
  5.     那么CObject就可以在运行时检查一个类对象所属的具体类。
  6.     当你想检查一个函数参数的具体类型或者想针对一个特殊类编写一些特殊的代码时,
  7.     这个功能是很有用的。
  8.     CObject的成员方法IsKindOf可用于检查一个对象是否属于指定的类或者它是否派生
  9.     于指定的类。IsKindOf的参数是一个CRuntimeClass对象,我们可以使用宏
  10.     RUNTIME_CLASS(class name)的方式获得。
  11. */
  12. /*
  13.     使用RUNTIME_CLASS宏的例子
  14.     一般情况下,我们没有必要直接访问CRuntimeClass,其比较常用的功能是作为
  15.     IsKindOf的参数,以检查具体类。
  16. */
  17. CRuntimeClass* pClass = RUNTIME_CLASS( CObject );   
  18. /*
  19.     使用IsKindOf的例子
  20.     注意
  21.     要确保要检查的类具体运行时识别功能,即它是直接或间接的从CObject
  22.     派生且使用了宏DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC,
  23.     DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE或者DECLARE_SERIAL和IMPLEMENT_SERIAL
  24.     如果被检查的对象属于指定的类,IsKindOf会返回TRUE。
  25.     IsKindOf不支持多继承或虚基类。
  26. */
  27. class CPerson : public CObject 
  28. {
  29.     DECLARE_DYNAMIC( CPerson )
  30.     // other declarations
  31. };
  32. IMPLEMENT_DYNAMIC( CPerson, CObject )
  33. IMPLEMENT_DYNCREATE(CMyDynCreateObj, CObject)
  34. void MemoryCorruptingSnippet(bool bCorrupt)
  35. {
  36.     if (bCorrupt)
  37.     {
  38.         CAge* pcage = new CAge(21);  // CAge is derived from CObject.
  39.         Age* page = new Age(22);     // Age is NOT derived from CObject.
  40.         *(((char*)pcage) - 1) = 99;   // Corrupt preceding guard byte
  41.         *(((char*)page) - 1) = 99;    // Corrupt preceding guard byte
  42.         AfxCheckMemory();
  43.     }
  44. }
  45. void SomeFunction(void)
  46. {
  47.     CObject* pMyObject = new CPerson;
  48.     if(NULL != pMyObject &
  49.         pMyObject->IsKindOf( RUNTIME_CLASS( CPerson ) ) )
  50.     {
  51.         //if IsKindOf is true, then cast is all right
  52.         CPerson* pmyPerson = (CPerson*) pMyObject ;
  53.         pmyPerson->AssertValid();
  54.         // other code goes here...
  55.     }
  56.     delete pMyObject;
  57. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值