基本クラスを受け入れる関数を呼び出すときにdynamic_castを使用する必要がありますか?
-
06-07-2019 - |
質問
このようなクラスがいくつかあります:
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を使用しますか?もしそうなら、主な理由は何ですか?
解決
bob
は C ^
型であることがわかっているため、コンパイル時に IA ^
に安全にダウンキャストできることを知っています。 dynamic_cast
は、ここでは static_cast
と同等です。さらに、提案する暗黙的なキャストも安全です。
dynamic_cast
は、基本型から派生型にアップキャストする場合にのみ必要です。
他のヒント
標準C ++では、dynamic_castを使用して、階層ではなく、上に移動します。この場合、IAまたはIBをCに変換しようとするために使用します:
IA^ temp = /* get a C in some way. */;
C^ tempC = dynamic_cast<C^>(temp);
いいえ、C ++ / CLIでは、ここでの動的キャストも必要ないと思います。 Derived *は、曖昧さがない限り暗黙的にBase *に変換します。多重継承。同じことがおそらく「gc-pointers」にも当てはまります。 C ++では、動的キャスト(アップキャスト時)には、ポリモーフィッククラス(少なくとも1つの仮想関数)が必要です。ただし、C ++ / CLIがどのように処理するのかわかりません。すべてのCLIクラスはデフォルトでポリモーフィックだと思います。
ところで、C ++タグを削除することもできます。 ;)
所属していません StackOverflow