0

私は MFC C++ ポリモーフィズムに行き詰まっています。ここに私の問題があります:

私は多くの便利なものを実装するクラス、たとえば A を持っていますが、そこからインスタンス化する必要があるすべてのオブジェクトは少しカスタマイズする必要があるため、各クラスを派生させることにしました (ig: A1、A2... )。さて、これらのオブジェクトの初期化には、すべてのサブクラスで同じ操作が必要になるため、このタスクを実行する静的メソッドを作成しましたが、ここで問題が発生します。

void CFastInit::FastGrid( const CStatic &stPosition, A *pGrid, UINT nID, CWnd *pWnd )
{
    stPosition.GetClientRect( rctGriPos );
    stPosition.MapWindowPoints( pWnd, rctGriPos );
    pGrid->Create( WS_CHILD | WS_VISIBLE, rctGriPos, pWnd, nID );
    pGrid->SetWholeRowSel();
}

デバッガーから、pGrid が正しいタイプ ( A1, A2... ) であることがわかりますが、呼び出しは次のとおりです。

pGrid->Create(

A::Create に対して行われ、A1::Create または A2::Create に対してではありません。これに対する回避策はありますか?

4

3 に答える 3

3

static function があるようFastGrid()です。この関数は、基本クラスのすべてのオブジェクト、および基本クラスから派生した任意のクラスのすべてのオブジェクトによって共有されることに注意してください。

この関数では、基本クラスへのポインターをパラメーターとして取得し、 A *pGridそのポインターで関数呼び出しを行います: pGrid->Create()

ここで、派生クラス オブジェクトをpGridポイントする場合、ポリモーフィズムが必要な場合は、関数を にする必要があります。仮想でない場合、基本クラスの関数が常に呼び出されます。Create()virtualCreate()

おそらく、次のようなものが必要です。

class base
{
public:
    static void foo( base * ptr)
    {
        ptr->bar();
    }
    virtual void bar()
    {
        std::cout << "base class bar() call" << std::endl;
    }
};

class derived : public base
{
    virtual void bar()
    {
        std::cout << "derived class bar() call" << std::endl;
    }
};

int main(int argc, char *argv[])
{
    base::foo( new derived() );
}

出力:

derived class bar() call

virtualキーワードを削除すると、出力は次のようになります。

base class bar() call

そしてそれがあなたが今持っているものです。また、私の例の静的関数は次のように呼び出すこともできることに注意してください: derived::foo( new derived() );、それは何も変更しません。

于 2012-08-01T13:04:02.547 に答える
0

これは、pGrid が "A" 型で指定されているためです。タイプチェックを使用してキャストし、必要なメソッドを強制的に使用することができます。

于 2012-08-01T13:02:29.830 に答える
0

あなたの場合、仮想キーワードを追加するのを忘れたことが根本的な原因である可能性がありますが、ctor からインスタンス メソッドを呼び出した場合、仮想関数も機能しません。基本クラスは基本クラスに属しているため、派生クラスと同じです。

また、仮想関数のほかに、ATL で多くの例が見られるように、テンプレートを使用して同様の効果を達成することもできます。

于 2012-08-01T13:30:56.330 に答える