如何理解运行时(Runtime)?

解决方案 »

  1.   

    记不太清楚了。大概是这样的:
    CRuntimeClass是一种数据结构,如果某个类继承自CObject,并且在类声明中,加入DECLARE_DYNCREATE、DECLARE_DYNAMIC等宏,那么这个类就可以在运行时知道其基类。Each class derived from CObject is associated with a CRuntimeClass structure that you can use to obtain information about an object or its base class at run time. The ability to determine the class of an object at run time is useful when extra type checking of function arguments is needed, or when you must write special-purpose code based on the class of an object. Run-time class information is not supported directly by the C++ language.
      

  2.   

    CRuntimeClass在MFC中的作用很重要,因为MFC利用它来进行类的动态确定,即是通过类变量来判定该变量是否为某一类的实例。由于指针的类型是可以转换的,所以时常会出现从A到B的转换导致错误。而在MFC的各种书籍中对CRuntimeClass的介绍是比较少的,在这里总结它的一些用法。
    1、动态确定类
    在MFC中CObject::IsKindOf( const CRuntimeClass* pClass ) 利用CRuntimeClass来进行判定,如果你生成的类是以CObject为基础的,你可以使用该成员函数来判定。下面举一个例子来加深了解。
    class CAge:public CObject
    BOOL IsAge(CObject* pO)
    {
        return pO->IsKindOf( RUNTIME_CLASS( CAge ) );
    }
    BOOL IsAge2(CAge* pO)
    {
        return pO->IsKindOf( RUNTIME_CLASS( CAge ) );
    }
    void main(void)
    {
        CObject a;
        CAge b;
        IsAge(&a);//return FALSE
        IsAge(&b);//return TRUE
        IsAge2((CAge*)&a);//return FALSE,避免强制转换带来的错误
    }
    2、生成类
    CObject CRuntimeClass::CreateObject(void)可以产生一个类变量。作用和new类似,但在某些特殊场合有独特的作用。下面举一个例子来加深了解。
    假定有以下几个类定义
    class CWndA: public CWnd
    class CWndB: public CWnd
    function1()
    {
        CRuntimeClass* pC=RUNTIME_CLASS( CWndA );
        CreateWnd(pC);
    }
    CWnd* CreateWnd(CRuntimeClass* pClass)
    {
        return (CWnd*)pClass->CreateObject();
    }
    在上面例子中,CreateWnd返回的是CWnd* 其实它是一个CWndA*。你可以进行由父类到子类的强制转换而不必要担心出错。使用CRuntimeClass可以代替使用switch生产类实例的一些繁琐。(请好好想想它的用途,当你发现它的好处时,你一定会大吃一惊,M$使用宏来实现类的动态检测,如果谁有兴趣可以去看看MFC的源代码。)
    注意:在类的定义中使用IMPLEMENT_DYNCREATE后方可生效。
      

  3.   

    贴主问的是runtime不是RuntimeClass
      

  4.   

    http://www.yesky.com/20020810/1624534.shtml
    上面的文章对你应该有所帮助