3

編集:「アップキャスト」を「ダウンキャスト」に修正しました。

私が作業しているクラスが C++ から来ている場合、Python でダウンキャストを行う最良の方法を見つけようとしています。C++ で次のように定義された 2 つのクラスがあるとします。

struct Base
{
    int foo()
    {
        return 7;
    }
};

struct Derived : Base
{
    int bar()
    {
        return 42;
    }
};

そしてもう一つの機能

Base baz()
{
    return Derived();
}

Pythonで試してみると

der = baz()
print der.foo()
print der.bar()

Python は Base の関数しか認識していないため、bar() の呼び出しは失敗します。

私の解決策は、Derived に別の関数を追加することでした。

Derived * fromBase(Base * b)
{
    return reinterpret_cast<Derived *>(b);
}

次に、Python スクリプトの最初の行を read に変更するder = Derived.fromBase(baz())と、スクリプトは期待どおりに機能します。

ただし、この作業を行うために reinterpret_cast を使用しているという事実は、非常に間違っているようです。reinterpret_cast ほど危険なものを使用する必要のないダウンキャストのより良い方法はありますか? ない場合、返品ポリシーはどうあるべきfromBase()ですか?

誰かが尋ねる前に、はい、ダウンキャストが必要です。これが、私が使用しなければならないライブラリの仕組みです。

編集:

このC#コードのように機能するものを探しています:

Base b = new Derived();
Derived d = b as Derived;
if (d != null)
    ...
4

1 に答える 1

1
Base baz()
{
    return Derived();
}

戻り値の型からわかるように、これはオブジェクトBaseはなくDerivedオブジェクトを返します。したがって、ダウンキャストする (アップキャストしない) ものは何もありません。したがって、まずそれを修正する必要があります。

もっと言えば、あなたの言うreinterpret_castとおり、この文脈では間違いなく日陰です。dynamic_cast実際、ダウンキャストに使用するツールです。

より根本的に、なぜダウンキャストの必要性を感じるのかを自問する必要があります。サンプル コードが合成であり、正確な問題を表していない可能性がありますが、なぜ?をbaz返すべきではないのでしょうか。Derived


スニペットに相当するものは次のとおりです。

Derived d;
Base& b = d;
if(Base* p = dynamic_cast<Derived*>(&b))
    // okay; b is actually an instance of Derived
于 2012-09-01T00:26:55.637 に答える