CRuntimeClass

1.CRuntimeClass  DECARE_DYNAMIC()
CRuntimeClass没有基类。 每个由CObject派生的类都与一个CRuntimeClass结构相联系,用户可以使用该结构获取一个对象及其基类的运行时信息。当需要额外的函数参数检查时,或当用户必须根据一个对象的类编写特殊目的代码时,在运行时确定该对象的类就非常有用。C++并不直接支持运行时类的信息。
struct CRuntimeClass
{
// Attributes
 LPCSTR m_lpszClassName; //存放asscii类名的以空字符结尾的字符串
 int m_nObjectSize;   //以字节为单位给出对象的大小
 UINT m_wSchema; // schema number of the loaded class
 CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class
#ifdef _AFXDLL
 CRuntimeClass* (PASCAL* m_pfnGetBaseClass)();
#else
 CRuntimeClass* m_pBaseClass;
#endif

// Operations
 CObject* CreateObject();
 BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const;

 // dynamic name lookup and creation
 static CRuntimeClass* PASCAL FromName(LPCSTR lpszClassName);
 static CRuntimeClass* PASCAL FromName(LPCWSTR lpszClassName);
 static CObject* PASCAL CreateObject(LPCSTR lpszClassName);
 static CObject* PASCAL CreateObject(LPCWSTR lpszClassName);

// Implementation
 void Store(CArchive& ar) const;
 static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum);

 // CRuntimeClass objects linked together in simple list
 CRuntimeClass* m_pNextClass;       // linked list of registered classes
 const AFX_CLASSINIT* m_pClassInit;
};

总之,DECARE_DYNAMIC()宏其实只是为了在类中添加:
  Static CRuntimeClass  ClassCCmdTarget;  //静态变量
  Virual CRuntimeClass *GetRuntimeClass() const; //成员函数
  DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC是为了确定运行时对象属于哪一个类而定义的宏.

IMPLEMENT_DYNAMIC(CView,CWnd)  "运行时类型识别"
替换结果如下:
  Static char _lpszCView[] = “CView”;
 CRuntimeClass CView::classCView = {_lpszCView,sizeof(CView),0xFFFF,NULL,&CWnd::classCWnd,NULL};
 static AFX_CLASSINIT _init_CView(&CView::classCView);

 CRuntimeClass *CView::GetRuntimeClass() const{ return &CView::classCView;}
 
 **CObject作为链表的表头,不能直接套用宏,要特别处理.

原文链接: https://www.cnblogs.com/belie8/archive/2011/08/11/2135498.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    CRuntimeClass

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/30355

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午7:42
下一篇 2023年2月8日 上午7:43

相关推荐