この問題を解決する方法を知りたいです。この質問が私に何を求めているのか理解できません:
dynamic_cast<Y>(new X)
- 合法であること?
- おそらく成功するには?
この問題を解決する方法を知りたいです。この質問が私に何を求めているのか理解できません:
dynamic_cast<Y>(new X)
まず、合法でYあるためには、ポインター型でなければなりません。それでは、質問を次のように書き直しましょう。これを行うと、 が完全なクラス型であり、多相型であるか、 と同じ型であるか、 の基底クラスである場合に有効です。dynamic_cast<Y
cv_qualifiers*>( new X )XXYXX
Yが と同じXか、 の基底クラスである
場合に成功しXます。これらの場合、dynamic_castは と同じ動作をしstatic_cast、実際には暗黙的な変換に対応することに注意してください。したがって、通常はnew Xキャストなしで と書くだけです。(キャストが必要になる特殊なケースがいくつかあります。通常、結果をvoid*パラメーターに渡す場合です。そのような場合は を使用したいと思いますが
static_cast、この場合、2 つのセマンティクスはまったく同じです。)
最後に、特殊なケースが 1 つあります (これも成功します): if
Xは多相型であり、Yisです。この場合、はとは異なるセマンティクスを持ちますが、返される fromは「ほとんどの派生型へのポインター」型を持つため、実際の効果は同じになります (また、暗黙的な変換と同じです)。void
cv_qualifiers *dynamic_cast
static_castX*new X
質問は次のとおりです。
次のコードが正当であり、さらにキャストが成功するように、
Xandの定義について何が言えますか?Y
その場合、答えはかなり単純明快です。式が正当Xであるためには、完全な型でなければなりません。new動的キャストは、非仮想ベースへのアップキャストに有効であるため、 が非仮想ベースYへのポインター (おそらく CV 修飾され、それ自体へのポインターを含むX) である場合、キャストは有効であり、成功します。
さらに、多相型 (つまり、仮想関数を持つクラス)に対する動的キャストの有効な使用法は他にもあります。XがポリモーフィックでYある場合、であるvoid *かY、 の継承階層内の他のクラスへのポインタである可能性がありますX。ただし、キャストは がベースへのポインタである場合にのみ成功Yします (ただし、このベースは仮想である可能性があります!)。
(現在の推論は、キャスト対象の動的タイプが既にわかっているため、任意の動的キャストの場合よりも単純です。一般に、動的キャストははるかに複雑なことを行うことができます。)
Y と X がわからないと、まったく答えられません。たとえば、Y が int の場合は違法です。それ以外の場合、Y がポリモーフィック クラスへのポインターである場合、成功するか失敗する可能性がありますが、それについて「可能性が高い」ものは何もありません。最後に、これは厄介なメモリ リークです。