2

ここでウィキペディアの RTTI の例を調べていました。

この部分で迷っています

abc *abc_pointer = new xyz();

abc_pointer が xyz オブジェクトを指すように作成されている場合、それが識別されることは明らかではありません。つまり、比較の使用は何ですか

xyz_pointer != NULL

後で、一般的にRTTIは?ここで何か不足していますか?

4

1 に答える 1

4

重要なのは、次の場合です。

xyz_pointer = dynamic_cast<xyz*>(abc_pointer);

後でそれを にキャストし直しxyzます。すべての s がs であっても、すべての s がabcs になるわけではありません。ここで、「これがこれらのいずれかである場合はキャストし、そうでない場合は停止して、悪いことをする代わりに私に与えてください」と述べています。が RTTI を使用しています。xyzxyzabcdynamic_castNULLdynamic_cast

おもちゃの例でabc*は、 がxyz*too. 関数を想像してください:

void (abc *ptr) {
  if (dynamic_cast<xyz*>(ptr)) {
    //...
  }
  else {
    //...
  }
}

その一般的な例では、与えられたものが実行時に型情報を見ずに にキャストできるかどうかを判断する方法はありません。xyzこれはまさにdynamic_castそうです。

static_cast<xyz*>(ptr)キャストを使用すると、実際には合法的ではなく、未定義の動作につながる可能性が最も高い場合でも、常に機能しているように見えることに注意してください。

ただし、「コードの匂い」を示す可能性のあるものをたくさん書いていることに気付いた場合はif (dynamic_cast<...、リファクタリングを検討する必要があります。おそらく、仮想メソッドの方が適切です。dynamic_castRTTI は、C++ を設計する際の最後の手段にする必要があります。

于 2012-05-09T18:48:41.033 に答える