我在子类中重写了基类函数ShowProperties,但是仍然调用了基类函数。为什么是这样?

类层次结构:

class CDiagramEntity : public CObject
{
public:
  virtual void ShowProperties( CWnd* parent, BOOL show = TRUE );
}

class CNetworkSymbol : public CDiagramEntity
{
  /*NO 'ShowProperties' Function*/
}

class CDeviceEntity : public CNetworkSymbol
{
  /*NO 'ShowProperties' Function*/
}

class CSwitch : public CDeviceEntity
{
public:
  virtual void ShowProperties( CWnd* parent, BOOL show = TRUE );
}


采用:

/*Use Here*/
{
  CDiagramEntity* obj = GetSelectedObject();
  if( obj )
  {
    CSwitch* sw = (CSwitch*)obj;
     sw->ShowProperties( this );
     /*calls CDiagramEntity's function, not CSwitch's function*/
  }
}


PS:


正如@iammilind所建议的,我从CDiagramEntity中删除了virtual并使用了强制转换,调用了CSwitch的功能,并从其显示的属性中(属性只能更改为创建CSwitch时显示的内容),我确定CSwitch。
作为@ user1610015的评论,如果我使用

CSwitch* sw = dynamic_cast<CSwitch*>(obj);


它返回NULL
正如@Andrian Sham所说,我有问题的原因:

GetSelectedObject()--->finally calls--->
{
  CDiagramEntity* result = NULL;
  if ( index < m_objs.GetSize() && index >= 0 )
    result = static_cast< CDiagramEntity* >( m_objs.GetAt( index ) );
  /*m_objs is defined as: CObArray m_objs;*/
  return result;
}



m_objs:

CObArray m_objs;


对象存储为:

...( CDiagramEntity* obj )
{
  obj->SetParent( this );
  m_objs.Add( obj );
  SetModified( TRUE );
}


但是有人可以更详细地解释吗?

最佳答案

我不确定您如何进行调试。您说您可以看到CSwitch的成员变量。如果您是说要检查CSwitch* sw = (CSwitch*)obj;并在sw中看到这样的var,那么实际上就错了。调试器只是“解释” sw指向的内存,因为它是CSwitch。这并不意味着它确实是CSwitch。

我只能想到一个案例。您是否已将对象实例放在任何STL容器中并取出来作为选择项?

(我完全忘记了MFC,这只是一个例子)

vector<CDiagramEntity> entities;  // note it is of type CDiagramEntity, not CDiagramEntity*

CSwitch aCSwitch;
entities.push_back(aCSwitch);

// later
SetItem("SomeValue", entities[i]);


您可能认为您的实体[i]应该返回CSwitch的实例,但事实并非如此。

(如果您确定所选项目应该是CSwitch,这是我能猜到的最好的方法)

10-08 05:47