2013-04-29 10 views
5

私はこのサイトの他のスレッドを読んでおり、dynamiccastとstatic_castの両方がアップキャストにどのように安全であるかを説明しています。キャスト - アップキャストのためにどうすればよいですか

アップキャストにはなぜこれらも必要ですか?

A * ptr = new B(); 

次いで、例えば

、クラスBがAから誘導された場合には、依然として動作し、タイプAのオブジェクト(Iは、アップキャストの変換は不要であるJava背景からも、午前のように振る舞います。アップキャストは自動的に行われますので、

私もダウンキャストは必要ありませんdynamic_castをこのサイトで読む[質問で「When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?」]は 。繰り返しますが、私はキャストは、あなたがダウンキャストされた場合にのみ、本当に必要であると思うだろう。

どこが間違っていますか?

+0

注:先の質問では、答えの1つが「あなたは下向きにキャストするために使用する必要はありません...」と述べています。しかし、完全な文脈の文脈から見ると、意味は、それを下向きに鋳造することだけに限定されないということです。 [私はあいまいさを取り除くためにその答えを編集して以来] –

答えて

3

複雑な継承階層を使用している場合、デフォルトのアップキャスト動作は機能しない可能性があります。例えば、考えてみましょう:その階層で

struct A {}; 
struct B : A {}; 
struct C : A {}; 
struct D : B, C {}; 

のタイプDのオブジェクトタイプAの二つの異なる塩基を有しています。 D*からA*への変換はあいまいです。例このタイプのためには、ベースまたは派生型のいずれかを取ると、あなたがベースを取るバージョンを呼び出す必要がありますすることができ、複数のオーバーロードを持つ関数がある場合、同様に中間ステップ

A *p = static_cast<B*>(d); // Give me the 'A' subobject within 'B' 

を通過する強制することができますタイプ(注:コードの臭いはここ!)、キャストを使用して過負荷の解決を指示できます。繰り返しますが、オーバーロードの解決を指示する必要がある場合、おそらく他の何か間違っていることでしょう。

コーナーケース(すなわち、デフォルトのアップキャストが機能しないとき)キャスト操作を明示的に使用する理由はまったくありません。キャストは警告ライトでなければならず、それらを過度に使用するとは通常のになり、コード。

+1

良いコーナーケースの例ですが、これは実際に関連性に疑問を抱いています。なぜなら、これはあなたのコードベースでは決して起こらない悪いコードなので(死のダイヤモンド) - 少なくともアップキャストと組み合わせて。 –

0

これはアップキャストにも必要な理由は何ですか?

はそうではありません、そしてupcastsのためにそれらを使用することは誤解を招くです(私見):何のキャストは理由ため必要ありません:論理的に、サブクラスのオブジェクトがあり、スーパークラスのインスタンス。

要約すると、私は明確なアップキャストをお勧めしません。私は、少なくとも一貫性を要求することを主張する人々のために:initialisationsに含め、どこでも明示upcastsを使用します。

A * ptr{static_cast<A*>(new B)}; 

ほとんどの人は、これは単なる愚かであることに同意します。

+0

それは私が考えたものです。しかし、なぜ、673アップフォースの答えが、「あなたは、動的キャストについて、それを下向きに使う必要はありません」と言っているのでしょうか?http://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-再解釈キャストされる。私の理解に根本的に間違っているものがあると思ったので、そのスレッドに投稿しなかった – user929404

+1

@ user929404あなたはその答えを誤解しています - 実際のメッセージは 'reinterpret_cast'はダウンキャストのためだけでなく他のキャスト。しかし、投稿は実際にアップキャストのために使用することは何も言いません(他のオンラインコメント、*これは助言します)。 –

1

複数の継承(Javaには実際にはない)の場合は、「this」ポインタを調整する可能性があります。その場合、reinterpret_castは安全ではありません。これは、static_castとdynamic_castが安全であると言って強調しようとしているものです。

小さなノートでは、Android-without-dynamic_castに移植されたコードベースの調査では、127個のdynamic_castが見つかりました。そのうち122個は実際には必要ありませんでした。これは、C++に非常に堪能な人が書いたコードです。

関連する問題