MFC复习(四)MFC执行期类型识别与动态创建技术

 

  1. struct CRuntimeClass
  2. {
  3.     // Attributes
  4.     LPCSTR m_lpszClassName;     //-------------类型识别宏用到
  5.     int m_nObjectSize;
  6.     UINT m_wSchema; // schema number of the loaded class
  7.     CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class //-------------动态创建宏用到
  8.     #ifdef _AFXDLL
  9.      CRuntimeClass* (PASCAL* m_pfnGetBaseClass)();
  10.     #else
  11.      CRuntimeClass* m_pBaseClass;//-------------类型识别宏用到
  12.     #endif
  13.     // Operations
  14.     CObject* CreateObject();//-------------动态创建宏用到
  15.     ...
  16. };

类型识别宏 用来建立类型识别网,通过它可以知道继承关系

DECLARE_DYNAMIC(class_name)
IMPLEMENT_DYNAMIC(class_name, base_class_name)
struct CRuntimeClass

...

    LPCSTR m_lpszClassName;     //类名

    CRuntimeClass* m_pBaseClass;//基类名

...

 

  1. //以一个MDI应用程序的CMainFrame类为例:
  2. //in MaimFrm.h
  3. class CMainFrame : public CMDIFrameWnd
  4. {
  5.     DECLARE_DYNAMIC(CMainFrame)
  6.     ...//
  7. }
  8. //in MaimFrm.cpp
  9. IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
  10. ...//
  11. //展开后得:
  12. //in MaimFrm.h
  13. class CMainFrame : public CMDIFrameWnd
  14. {
  15. public
  16.     static const CRuntimeClass classCMainFrame; 
  17.     virtual CRuntimeClass* GetRuntimeClass() const
  18.     ...//
  19. }
  20. //in MaimFrm.cpp
  21. AFX_COMDAT const CRuntimeClass CMainFrame::classCMainFrame =
  22.     {CMainFrame,sizeof(classCMainFrame  ),0xFFFF,NULL,(CRuntimeClass*)(&CMDIFrameWnd::classCMDIFrameWnd),NULL,NULL};
  23. CRuntimeClass* CMainFrame::GetRuntimeClass() const 
  24. return &CMainFrame::classCMainFrame; } 

 

动态创建宏   其实就是多实现了CreateObject函数

(注意此时类构造函数为protected类型,所以其实例只能通过CreateObject来构造)

DECLARE_DYNCREATE(class_name)
IMPLEMENT_DYNCREATE(class_name, base_class_name)

struct CRuntimeClass

...

    CObject* (PASCAL* m_pfnCreateObject)(); //指向CreateObject的函数指针

    CObject* CreateObject();

...

};

 

  1. //以SDI程序中的CMainFrame的动态创建为例
  2. //in MaimFrm.h
  3. class CMainFrame : public CFrameWnd
  4. {
  5.     DECLARE_DYNCREATE(CMainFrame)
  6.     ...//
  7. }
  8. //in MaimFrm.cpp
  9. IMPLEMENT_DYNCREATE(CMainFrame, CMDIFrameWnd)
  10. ...//
  11. //展开后
  12. //in MainFrm.h
  13. class CMainFrame
  14. {  
  15.    public
  16.      static const CRuntimeClass classCMainFrame; 
  17.      virtual CRuntimeClass* GetRuntimeClass() const
  18.      static CObject* PASCAL CreateObject();
  19.      ...//
  20. };
  21. //in MainFrm.cpp
  22. CObject* PASCAL CMainFrame::CreateObject() { return new classCMainFrame; } 
  23. AFX_COMDAT const CRuntimeClass CMainFrame::classCMainFrame =
  24.     {CMainFrame,sizeof(classCMainFrame),0xFFFF,CMainFrame::CreateObject,(CRuntimeClass*)(&CMDIFrameWnd::classCMDIFrameWnd),NULL,NULL};
  25. CRuntimeClass* CMainFrame::GetRuntimeClass() const 
  26. {
  27.     return &CMainFrame::classCMainFrame;

 

摘自

http://www.chinaitpower.com/A/2001-10-06/880.html

你可能感兴趣的:(null,Class,mfc,pascal)