我在子类中覆盖了基类函数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 );
}
但是有人可以更详细地解释这一点吗?