DECLARE_DYNCREATE
IMPLEMENT_DYNCREATE用上面这两个宏声明的类CyClass可以动态的创建:CRuntimeClass* pRuntimeClass = RUNTIME_CLASS( CMyClass );
CObject* pObject = pRuntimeClass->CreateObject();
ASSERT( pObject->IsKindOf( RUNTIME_CLASS( CMyClass ) ) );我不清楚的是:为什么要用这种方式进行创建,比如,简单的new一个不可以嘛?
如果是这种动态创建,除了可以用IsKindOf函数之外,还有什么好处?脱了裤子放屁的感觉啊~~:)另外,如果用这种动态创建,除了看起来比较“高级”之外,比如上面的例子:我得到了一个CObject对象的指针pObject,如果要调用MyClass的成员的话,是不是还要DOWN_CAST 一下啊?
请大虾指点一二三四啊~~~:)谢谢!

解决方案 »

  1.   

    DECLARE_DYNCREATE 到底有啥子用啊?
    据个例子:
    class CMyClass:public CObject
    {
    DECLARE_DYNCREATE(CMyClass)
    ...
    }
    IMPLEMENT_DYNAMIC(CMyClass,CObject)
    C*::Dump(...)
    {
    afxDump<<"a"<<GetRuntimeClass()->m_lpszClassName<<"at"<<(void*)this<<"\n";
    }
    调试器的输出窗口输出的是派生类“CMyClass”的真实名字,而不是不想这对宏名时输出的"CObject" 基类名字
      

  2.   

    这样你可以获得运行期类别信息的支持。Run-Time Class Information
    比如说:你可以用IsKindOf鉴别一个对象是否属于某个类;
    这个功能比较少用到。
    不过在序列化,从硬盘恢复一个对象时,就必须用到这个功能了。
      

  3.   

    同意macca11(铁骨铮铮) 。
    用了DECLARE_DYNCREATE宏才能支持动态创建;
    譬如有些函数需要RUNTIME_CLASS型的函数m_TabCtrl.AddPage(RUNTIME_CLASS(CSheetFac))
      

  4.   

    主要是为了RTTI而设计的。而这个又是从文件中读取一个字符串后动态创建一个对应类所需要的
      

  5.   

    建议去看看《深入浅出MFC》讲的很透彻的。
      

  6.   

    这是在早期C++不支持RTTI时,MFC自己所实现的RTTI现在C++已经有了RTTI功能,如通过typeid运算符。DECLARE_DYNCREATE
    IMPLEMENT_DYNCREATE
    可以让你在运行时得到类信息,以便于安全的Down Cast你要通过CObject 的指针使用子类的函数当然要Down cast。
      

  7.   

    建议去看看《深入浅出MFC》讲的很透彻的
      

  8.   

    差不多都讲完了
    补充说明一下http://www.yesky.com/20020810/1624534.shtml
      

  9.   

    DECLARE_DYNCREATE(...)  说白了就是一个宏。
    1.支持动态获取类名
    2.支持动态创建类
    参数是你要用的类名。