1

この問題を解決する方法を知りたいです。この質問が私に何を求めているのか理解できません:

dynamic_cast<Y>(new X)
  • 合法であること?
  • おそらく成功するには?
4

3 に答える 3

3

まず、合法で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

于 2012-12-02T12:33:39.993 に答える
3

質問は次のとおりです。

次のコードが正当であり、さらにキャストが成功するように、Xandの定義について何が言えますか?Y

その場合、答えはかなり単純明快です。式が正当Xであるためには、完全な型でなければなりません。new動的キャストは、非仮想ベースへのアップキャストに有効であるため、 が非仮想ベースYへのポインター (おそらく CV 修飾され、それ自体へのポインターを含むX) である場合、キャストは有効であり、成功します。

さらに、多相型 (つまり、仮想関数を持つクラス)に対する動的キャストの有効な使用法は他にもあります。XがポリモーフィックでYある場合、であるvoid *Y、 の継承階層内の他のクラスへのポインタである可能性がありますX。ただし、キャストは がベースへのポインタである場合にのみ成功Yします (ただし、このベースは仮想である可能性があります!)。

(現在の推論は、キャスト対象の動的タイプが既にわかっているため、任意の動的キャストの場合よりも単純です。一般に、動的キャストははるかに複雑なことを行うことができます。)

于 2012-12-02T12:18:40.197 に答える
1

Y と X がわからないと、まったく答えられません。たとえば、Y が int の場合は違法です。それ以外の場合、Y がポリモーフィック クラスへのポインターである場合、成功するか失敗する可能性がありますが、それについて「可能性が高い」ものは何もありません。最後に、これは厄介なメモリ リークです。

于 2012-12-02T12:07:02.840 に答える