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