サブクラスの基本クラス関数をオーバーライドします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から仮想を削除してキャストを使用すると、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 );
}
しかし、誰かがこれをより詳細に説明できますか?