C++ 为什么DECLARE_是动态的&;为动态向下广播实现动态必要性?

C++ 为什么DECLARE_是动态的&;为动态向下广播实现动态必要性?,c++,dynamic,mfc,downcast,C++,Dynamic,Mfc,Downcast,我有两门课: /*Switch.h*/ class CSwitch : public CDeviceEntity {} /*EndSystem.h*/ class CEndSystem : public CDeviceEntity {} 但当我使用: CDeviceEntity* dev = NULL; dev = topo->headList[i]->node; if ( DYNAMIC_DOWNCAST( CEndSystem, dev ) != NULL )

我有两门课:

/*Switch.h*/
    class CSwitch : public CDeviceEntity {}
/*EndSystem.h*/
    class CEndSystem : public CDeviceEntity {}
但当我使用:

CDeviceEntity* dev = NULL;
dev = topo->headList[i]->node;
if ( DYNAMIC_DOWNCAST( CEndSystem, dev ) != NULL ) {}
DYNAMIC\u DOWNCAST
”始终返回
not NULL
,而dev是一种
class-CEndSystem
class-CSwitch

如果使用:

/*Switch.h*/
    class CSwitch : public CDeviceEntity { DECLARE_DYNAMIC(CSwitch) } 
    and
/*Switch.cpp*/
    IMPLEMENT_DYNAMIC(CSwitch, CDeviceEntity)
/*EndSystem.h*/
    class CEndSystem : public CDeviceEntity { DECLARE_DYNAMIC(CEndSystem) }
    and
/*EndSystem.cpp*/
    IMPLEMENT_DYNAMIC(CEndSystem, CDeviceEntity)
DYNAMIC\u DOWNCAST
”根据
class CEndSystem
class CSwitch
返回
NULL
not NULL

为什么“
DECLARE\u DYNAMIC
”和“
IMPLEMENT\u DYNAMIC
”对于“
DYNAMIC\u DOWNCAST
”是必需的

/*算法.h*/
静态int getESNum();
/*算法.cpp*/
int CAlgorithm::getESNum()
{
整数计数=0;
CDeviceEntity*dev=NULL;
对于(int i=0;inodeNum;i++)
{
dev=topo->headList[i]->节点;
如果(动态向下广播(CEndSystem,dev)!=NULL)
{
计数++;
}
}
返回计数;
}
/*算法.h*/
静态int getSWNum();
/*算法.cpp*/
int CAlgorithm::getSWNum()
{
整数计数=0;
CDeviceEntity*dev=NULL;
对于(int i=0;inodeNum;i++)
{
dev=topo->headList[i]->节点;
如果(动态向下广播(CSwitch,dev)!=NULL)
{
计数++;
}
}
返回计数;
}

保存文档时,这些函数在序列化中被调用。

DYNAMIC\u DOWNCAST是一种在编译器提供信息之前必须执行动态强制转换的方法。强制转换信息是使用宏DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC创建的,这些宏使用类CRuntimeClass来决定强制转换是否有效

DYNAMIC_DOWNCAST只是这样做的:

CObject* AFX_CDECL AfxDynamicDownCast(CRuntimeClass* pClass, CObject* pObject)
{
    if (pObject != NULL && pObject->IsKindOf(pClass))
        return pObject;
    else
        return NULL;
}
DECLARE_动态宏添加以下代码:

#define DECLARE_DYNAMIC(class_name) \
protected: \
    static CRuntimeClass* PASCAL _GetBaseClass(); \
public: \
    static const CRuntimeClass class##class_name; \
    static CRuntimeClass* PASCAL GetThisClass(); \
    virtual CRuntimeClass* GetRuntimeClass() const; \
#define IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew, class_init) \
CRuntimeClass* PASCAL class_name::_GetBaseClass() \
    { return RUNTIME_CLASS(base_class_name); } \
AFX_COMDAT const CRuntimeClass class_name::class##class_name = { \
    #class_name, sizeof(class class_name), wSchema, pfnNew, \
        &class_name::_GetBaseClass, NULL, class_init }; \
CRuntimeClass* PASCAL class_name::GetThisClass() \
    { return _RUNTIME_CLASS(class_name); } \
CRuntimeClass* class_name::GetRuntimeClass() const \
    { return _RUNTIME_CLASS(class_name); }

#define IMPLEMENT_DYNAMIC(class_name, base_class_name) \
    IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL, NULL)
添加工具\u动态添加此代码:

#define DECLARE_DYNAMIC(class_name) \
protected: \
    static CRuntimeClass* PASCAL _GetBaseClass(); \
public: \
    static const CRuntimeClass class##class_name; \
    static CRuntimeClass* PASCAL GetThisClass(); \
    virtual CRuntimeClass* GetRuntimeClass() const; \
#define IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew, class_init) \
CRuntimeClass* PASCAL class_name::_GetBaseClass() \
    { return RUNTIME_CLASS(base_class_name); } \
AFX_COMDAT const CRuntimeClass class_name::class##class_name = { \
    #class_name, sizeof(class class_name), wSchema, pfnNew, \
        &class_name::_GetBaseClass, NULL, class_init }; \
CRuntimeClass* PASCAL class_name::GetThisClass() \
    { return _RUNTIME_CLASS(class_name); } \
CRuntimeClass* class_name::GetRuntimeClass() const \
    { return _RUNTIME_CLASS(class_name); }

#define IMPLEMENT_DYNAMIC(class_name, base_class_name) \
    IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL, NULL)

我想很少有人会用这个来代替新的项目,而更喜欢C++标准<代码> DyjixCaseStistaCase和 RealTytCase)。< < P>动态>下拉>代码>什么地方?你能至少提一下<代码> DyrimCysCase<代码>
IMPLEMENT\u DYNAMIC
DECLARE\u DYNAMIC
来自哪里?我从未遇到过他们。@KonradRudolph,我编辑过这篇文章。@Rubby,但你没有给我们我想要的,只是添加了不相关的评论。@KonradRudolph谢谢,我添加了代码。。。