9

私は Visual Studio を使用しており、有効な動的キャストを実行しています。RTTI が有効になっています。

編集:より現実的になるようにコードを更新しました

struct base
{
    virtual base* Clone()
    {
        base* ptr = new base;
        CopyValuesTo( ptr );
        return ptr;
    }
    virtual void CopyValuesTo( base* ptr )
    {
       ...
    }
    virtual ~base()
    {
    }
}

struct derived : public base
{
    virtual base* Clone()
    {
        derived* ptr = new derived;
        CopyValuesTo( ptr );
        return ptr;
    }
    virtual void CopyValuesTo( base* ptr )
    {
       ...
    }
    virtual ~derived()
    {
    }
}  

void Class1::UseNewSpec( base* in_ptr ) //part of a totally unrelated class
{
    derived* ptr = dynamic_cast<derived *>(in_ptr);
    if( !ptr )
       return;
    delete m_ptr;
    m_ptr = ptr->Clone(); //m_ptr is a member of Class1 of type base*
}

//usage : 
Class1 obj;
derived new_spec; 
obj.UseNewSpec( &new_spec );

私のデバッガーは、例外がスローされたときに in_ptr が正しいタイプであると言います。Google は特に役に立たないようです。何か案は?乾杯。

4

5 に答える 5

9

https://docs.microsoft.com/en-us/cpp/cpp/typeid-operator?view=vs-2019に __non_rtti_object_exception に関する情報があります。

MSDN から:

ポインターが有効なオブジェクトを指していない場合は、__non_rtti_objectexception がスローされ、エラー (アクセス違反など) をトリガーした RTTI を分析しようとしていることを示します。 /GR)。

于 2009-05-12T21:08:05.873 に答える
6

私はあなたの擬似コードに基づいてテストを実行しました、そしてそれは働きます。したがって、ビルド構成でRTTIが本当に有効になっている場合は、投稿した内容に反映されていない別の問題である必要があります。

于 2009-05-12T21:30:33.293 に答える
6

dynamic_cast に関する RTTI 例外、失敗、またはエラーは、不正なキャストを実行したことを意味している可能性があります。 classと classの両方が次の制約を満たすdynamic_cast<derived*>(ptrToBase)場合にのみ有効です: そのクラス、またはその基底クラスの 1 つに仮想メンバー関数があります。derivedbase

この仮想メンバー関数は、デストラクタを含め、何でもかまいません。他のメンバー関数がない場合は、次を試すことができます。

struct base
{
    virtual ~base(){}
    ...
}

struct derived : public base
{
    ...
}

base仮想メンバ関数が追加され、派生も同様です。それを試して、問題が解決するかどうかを確認してください。

編集-追加:

@carleeto - 「すでに仮想デストラクタがありました」では、==ベースですか?

派生に仮想デストラクタがあり、ベースが非仮想 dtor である場合でも、このエラーが発生する可能性があります。

また、オブジェクトが破棄されていないことを確認する必要があります。デストラクタが実行されると、dynamic_cast を安全に呼び出すことができなくなります。ctors と dtors にトレースを追加してみてください。

于 2009-05-12T21:06:47.433 に答える
1

すべてのソース ファイルで RTTI が有効になっていることを二重に確認してください。

それ以外の場合、ポインターは無効です。

于 2009-05-12T21:25:08.183 に答える
0

メソッドがbase含まれていますか?virtual動作するために必要dynamic_castです。

于 2009-05-12T21:07:23.673 に答える