2016-08-15 16 views
3

hereを参照してください:dynamic_castが非多型のアップキャストに使用するのはなぜですか?

のdynamic_castはクラスだけ (またはボイド*)へのポインタと参照を使用することができます。その目的は、 タイプの結果が、宛先の有効な完全オブジェクトを指すようにすることです。 ポインタタイプ。

として暗黙の変換が許可されているのと同じ方法で、これには当然ポインタアップキャスト( からポインタへのポインタからポインタへの変換)が含まれます。

しかしdynamic_castをすることもでき意気消沈( ポインタに由来するからポインタ・ベースの変換)多型クラス(仮想メンバーを有するもの) -andのみ尖った物体IF-の有効完全なオブジェクトである場合 ターゲットタイプ。

non-polymorphic型のアップキャストにはdynamic_castを使用できますが、non-polymorphic型のダウンキャストではもう正しくないのはなぜですか?

+1

私はそれをアップキャスティングに使用することは問題ありません。** ** non ** - polymorphic_タイプ。 –

+1

変換されていない場合は 'null_ptr'を返すので、仮想ディスパッチが必要なのは、変換が良好であることを確認するためです。さもなければ '[expr.dynamic.cast]'はダウンキャストのために多形でなければならないと言います。 – NathanOliver

+0

しかし、なぜ "多形性クラス"がダウンキャストのみについて輪郭を描かれているのですか? – Narek

答えて

5

派生型へのポインタの変換は、派生型が常にそのオブジェクトのインスタンスであるため、指すオブジェクトの正確な型について何も知らなくても行うことができます。ベースタイプ。つまり、変換はのstaticの情報にのみ依存します。だから常にその方向に進むことができるので、その方向に常にdynamic_castは大丈夫です。

dynamic_castを他の方法に変換するには、その情報がないと変換が有効かどうかを知る方法がないため、指示されているオブジェクトの実際のタイプを知る必要があります。例えば:タイプBase変換の対象に、実際の点でbpが有効でない場合は、この状況では

Base* bp = get_base(); 
Derived* dp = dynamic_cast<Derived*>(bp); 

、。タイプがDerivedのオブジェクトまたはDerivedから派生したタイプを指している場合、キャストは大丈夫です。

実行時にオブジェクトの正確な型を判断するために、サポートコードは、多型の場合にのみ必要な埋め込み型の情報に依存します。そのため、ベースから派生したキャストには多態型が必要です。必要な情報が確実に存在することを保証します。

標準によって、非ポリモーフィック型に対して派生からベースへの変換が無効になる可能性がありますが、それはプロクエストマンの制限です。それを禁止する正当な理由はない。

+3

"禁止する正当な理由はない*"私は1つ持っている: 'static_cast'がすでにそれをカバーしているからだ。つまり、 'dynamic_cast'は多態性の基底から変換にのみ使用できます。そうすれば、あなたのコードベースで 'dynamic_cast'が見れば、誰かが何をしようとしているのかを知ることができます。 –

+0

@ NicolBolas - はい、procrusteanルールを好む人もいます。他はしません。 –

+0

dynamic_castは、クラス自体が多相である場合にのみ参照/ポインタの動的型を見ることができるのはなぜですか?内部メカニズムは何ですか? vtablesやそのようなものが関係していますか? @PeteBecker – gedamial