1

私はこのようないくつかのクラスを持っています:

interface class IA
{
};

interface class IB
{
};

public ref class C : public IA, public IB
{
};

public ref class D
{
    void DoSomething(IA^ aaa)
    {
    }

    void Run()
    {
        C^ bob = gcnew C();
        DoSomething(dynamic_cast<IA^>(bob));    // #1
        DoSomething(bob);           // #2
    }
};

現時点では、そのような関数を呼び出すときは常に動的キャストを使用しようとしています (上記の #1)。
ただし、コードがかなり見苦しくなりますので、実際に必要かどうかを知りたいです。

このように dynamic_cast を使用しますか? もしそうなら、主な理由は何ですか?

4

3 に答える 3

2

標準のC++では、dynamic_castを使用して、階層を上ではなく下に移動します。この場合、これを使用してIAまたはIBをCに変換しようとします。

IA^ temp = /* get a C in some way. */;
C^ tempC = dynamic_cast<C^>(temp);
于 2009-10-23T14:14:19.570 に答える
1

いいえ、C++/CLI では動的キャストも必要ないと思います。Derived* は暗黙的に Base* に変換されますが、多重継承に関してあいまいな点がない限りです。「gc-pointers」についても同じことが言えます。C++ では、動的キャスト (アップキャストの場合) には (少なくとも 1 つの仮想関数を持つ) ポリモーフィック クラスが必要です。ただし、C++/CLI がそれをどのように処理するかはわかりません。すべての CLI クラスはデフォルトでポリモーフィックだと思います。

ところで、C++ タグを削除したい場合があります。;)

于 2009-10-23T14:12:28.370 に答える
1

bobが typeであることがわかっC^ているので、コンパイル時にIA^安全にダウンキャストできることがわかっているため、ここdynamic_castと同等static_castです。さらに、あなたが提案する暗黙のキャストも安全です。

dynamic_cast基本型から派生型にアップキャストする場合にのみ必要です。

于 2009-10-23T14:12:32.803 に答える