2012-05-09 3 views
2

私はwikipediaのRTTIの例を見ていました。ウィキペディアのRTTI定義について

私は(

ABC * abc_pointer =新しいxyzのこの部分については混乱しています)。 abc_pointerは、取得することidentified.Iが

xyz_pointerを比較の使用が何であるかを意味することは明らかでwouldntのXYZオブジェクトを指すように行われている場合は

!= NULL

後にそして一般的にRTTI?私はここに何かを逃していますか

+0

これよりもはるかに一般的です。 'abc'は多くの異なるクラスの基本クラスである可能性があります。実行時に、' abc_pointer'がどのタイプのオブジェクトを参照するのかを必ずしも知る必要はありません( 'abc'の子孫クラスのオブジェクトを指すことができるため)。 RTTIでは 'dynamic_cast '(実際にはRTTI)を使って、オブジェクトの実際の型が何であるかを判断することができます。 – birryree

答えて

4

彼らが行うときに重要なビットです:

xyz_pointer = dynamic_cast<xyz*>(abc_pointer); 

後でxyzに戻ってそれをキャストします。すべてxyzabcであるにもかかわらず、すべてabcxyz秒になるわけではありません。ここでは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++を設計する際の最後の手段になるはずです。

関連する問題