ここでウィキペディアの RTTI の例を調べていました。
この部分で迷っています
abc *abc_pointer = new xyz();
abc_pointer が xyz オブジェクトを指すように作成されている場合、それが識別されることは明らかではありません。つまり、比較の使用は何ですか
xyz_pointer != NULL
後で、一般的にRTTIは?ここで何か不足していますか?
ここでウィキペディアの RTTI の例を調べていました。
この部分で迷っています
abc *abc_pointer = new xyz();
abc_pointer が xyz オブジェクトを指すように作成されている場合、それが識別されることは明らかではありません。つまり、比較の使用は何ですか
xyz_pointer != NULL
後で、一般的にRTTIは?ここで何か不足していますか?
重要なのは、次の場合です。
xyz_pointer = dynamic_cast<xyz*>(abc_pointer);
後でそれを にキャストし直しxyz
ます。すべての s がs であっても、すべての s がabc
s になるわけではありません。ここで、「これがこれらのいずれかである場合はキャストし、そうでない場合は停止して、悪いことをする代わりに私に与えてください」と述べています。が RTTI を使用しています。xyz
xyz
abc
dynamic_cast
NULL
dynamic_cast
おもちゃの例でabc*
は、 がxyz*
too. 関数を想像してください:
void (abc *ptr) {
if (dynamic_cast<xyz*>(ptr)) {
//...
}
else {
//...
}
}
その一般的な例では、与えられたものが実行時に型情報を見ずに にキャストできるかどうかを判断する方法はありません。xyz
これはまさにdynamic_cast
そうです。
static_cast<xyz*>(ptr)
キャストを使用すると、実際には合法的ではなく、未定義の動作につながる可能性が最も高い場合でも、常に機能しているように見えることに注意してください。
ただし、「コードの匂い」を示す可能性のあるものをたくさん書いていることに気付いた場合はif (dynamic_cast<...
、リファクタリングを検討する必要があります。おそらく、仮想メソッドの方が適切です。dynamic_cast
RTTI は、C++ を設計する際の最後の手段にする必要があります。