我在看VC时,经常遇到CRuntimeClass类,这个类究竟有什么作用?

解决方案 »

  1.   

    CRuntimeClass结构
        要理解CObject,我们先来看一下CRuntimeClass这个在MFC中至关重要的一个结构。
    每个从CObject中派生的类都有有一个CRuntimeClass对象同它关联以完成在运行时得到类实例的信息或者是它的基类。 在afx.h中它的定义如下: 
    struct CRuntimeClass
    {
    // Attributes
    LPCSTR m_lpszClassName; //类名,一般是指包含CRuntimeClass对象的类的名称
    int m_nObjectSize; //包含CRuntimeClass对象的类sizeof的大小,不包括它分配的内存
    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
    //以上m_pBaseClass的指针(函数)是MFC运行时确定类层次的关键,它一个简单的单向链表
    // Operations
    CObject* CreateObject(); //这个函数给予CObject 派生类运行时动态建立的能力
    BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const;
    //这个函数使用 m_pBaseClass或 m_pfnGetBaseClass遍历整个类层次确定是否pBaseClass指向的类是基类,
    //使用它可以判断某类是否是从pBaseClass指向的类在派生来。
    // 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
      

  2.   

    很有用,比如说如果你知道一个类名,可以直接通过该类名(字符串)创建一个对象,想要详细了解这方面的情况,去看下《深入浅出MFC》第三章。
    MFC的设计很巧妙,通过几个简单的宏,就构建出了一张大网,实现了很多功能。这些东西,那本书上说得都很清楚。