私はwikipediaのRTTIの例を見ていました。ウィキペディアのRTTI定義について
私は(
ABC * abc_pointer =新しいxyzのこの部分については混乱しています)。 abc_pointerは、取得することidentified.Iが
xyz_pointerを比較の使用が何であるかを意味することは明らかでwouldntのXYZオブジェクトを指すように行われている場合は
!= NULL
後にそして一般的にRTTI?私はここに何かを逃していますか
私はwikipediaのRTTIの例を見ていました。ウィキペディアのRTTI定義について
私は(
ABC * abc_pointer =新しいxyzのこの部分については混乱しています)。 abc_pointerは、取得することidentified.Iが
xyz_pointerを比較の使用が何であるかを意味することは明らかでwouldntのXYZオブジェクトを指すように行われている場合は
!= NULL
後にそして一般的にRTTI?私はここに何かを逃していますか
彼らが行うときに重要なビットです:
xyz_pointer = dynamic_cast<xyz*>(abc_pointer);
後でxyz
に戻ってそれをキャストします。すべてxyz
がabc
であるにもかかわらず、すべてabc
がxyz
秒になるわけではありません。ここではdynamic_cast
は「もしそれがこれらの1つであれば、それをキャストしてください。そうでなければ、悪いことをする代わりに私を止めてください」と言います。 dynamic_cast
がRTTIを使用しています。
おもちゃの例では、abc*
がxyz*
であったことを明確に伝えることができます。機能を想像:
void (abc *ptr) {
if (dynamic_cast<xyz*>(ptr)) {
//...
}
else {
//...
}
}
その一般的な例でを指示する方法はありませんあなたは正確にdynamic_cast
が何をするかで、実行時にその型情報、見ずxyz
にキャストすることができます与えられているものであれば。
static_cast<xyz*>(ptr)
を使用していましたが、実際には合法的ではない場合でも、キャストは常に機能しているように見えます。
if (dynamic_cast<...
が「コードの臭い」を示しているかもしれませんが、リファクタリングを考慮する必要がありますが、仮想メソッドが適切である可能性があります。 dynamic_cast
とRTTIは、C++を設計する際の最後の手段になるはずです。
これよりもはるかに一般的です。 'abc'は多くの異なるクラスの基本クラスである可能性があります。実行時に、' abc_pointer'がどのタイプのオブジェクトを参照するのかを必ずしも知る必要はありません( 'abc'の子孫クラスのオブジェクトを指すことができるため)。 RTTIでは 'dynamic_cast'(実際にはRTTI)を使って、オブジェクトの実際の型が何であるかを判断することができます。 –
birryree