5

クラスとサブクラスが与えられた場合:

class Event {...}
class Note : public Event {...}

メモは複製され、関数 f() 内のポインターに格納されます。型情報はポインターに保持され、dynamic_cast によって復元できます。

void f()
{
   pEvent = pNote->Clone();    // create a clone of a Note
   ASSERT(dynamic_cast<Note*>(pEvent));   // check the pointer, here it works
}

ここで、 f() から戻った後、型情報は失われます:

f();
ASSERT(dynamic_cast<Note*>(pEvent));   // -> "Access violation - no RTTI-data"

VS デバッガーは有効なポインター値 (変更されていない) を表示しますが、スコープ内にいる場合を除き、派生クラスは表示しませんf()

関数から戻るときにポインタの RTTI 情報が失われるのはなぜですか?

4

1 に答える 1

7

ポインターに誤って害を及ぼすデストラクタがありました。このエラーを取り除いた後、RTTI は期待どおりに機能します。

于 2011-08-30T10:52:27.393 に答える