为什么 DECLARE_DYNAMIC & IMPLEMENT_DYNAMIC nessary 适合DYNAMIC_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 ) {}

" DYNAMIC_DOWNCAST "总是返回not NULL,而dev是class CEndSystemclass 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_DOWNCAST "根据class CEndSystemclass CSwitch返回NULLnot NULL

为什么"DECLARE_DYNAMIC"one_answers"IMPLEMENT_DYNAMIC"对于"DYNAMIC_DOWNCAST"是必要的?

/*Algorithm.h*/
static int getESNum();
/*Algorithm.cpp*/
int CAlgorithm::getESNum()
{
    int count = 0;
    CDeviceEntity* dev = NULL;
    for (int i = 0; i < topo->nodeNum; i++)
    {
        dev = topo->headList[i]->node;
        if ( DYNAMIC_DOWNCAST( CEndSystem, dev ) != NULL )
        {
            count++;
        }
    }
    return count;
}
/*Algorithm.h*/
static int getSWNum();
/*Algorithm.cpp*/
int CAlgorithm::getSWNum()
{
    int count = 0;
    CDeviceEntity* dev = NULL;
    for (int i = 0; i < topo->nodeNum; i++)
    {
        dev = topo->headList[i]->node;
        if ( DYNAMIC_DOWNCAST(CSwitch, dev) != NULL )
        {
            count++;
        }
    }
    return count;
}

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

DYNAMIC_DOWNCAST让我们回到了在编译器提供RTTI信息之前必须进行动态类型转换的情况。强制转换信息是使用宏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_DYNAMIC宏添加了以下代码:
#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; 

Add IMPLEMENT_DYNAMIC添加以下代码:

#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++标准的dynamic_cast<>调用(以及static_castreinterpret_cast)。

相关内容

  • 没有找到相关文章

最新更新