我在子类中重写了基类函数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,这是我能猜到的最好的方法)