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 一下啊?
请大虾指点一二三四啊~~~:)谢谢!
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 一下啊?
请大虾指点一二三四啊~~~:)谢谢!
据个例子:
class CMyClass:public CObject
{
DECLARE_DYNCREATE(CMyClass)
...
}
IMPLEMENT_DYNAMIC(CMyClass,CObject)
C*::Dump(...)
{
afxDump<<"a"<<GetRuntimeClass()->m_lpszClassName<<"at"<<(void*)this<<"\n";
}
调试器的输出窗口输出的是派生类“CMyClass”的真实名字,而不是不想这对宏名时输出的"CObject" 基类名字
比如说:你可以用IsKindOf鉴别一个对象是否属于某个类;
这个功能比较少用到。
不过在序列化,从硬盘恢复一个对象时,就必须用到这个功能了。
用了DECLARE_DYNCREATE宏才能支持动态创建;
譬如有些函数需要RUNTIME_CLASS型的函数m_TabCtrl.AddPage(RUNTIME_CLASS(CSheetFac))
IMPLEMENT_DYNCREATE
可以让你在运行时得到类信息,以便于安全的Down Cast你要通过CObject 的指针使用子类的函数当然要Down cast。
补充说明一下http://www.yesky.com/20020810/1624534.shtml
1.支持动态获取类名
2.支持动态创建类
参数是你要用的类名。