巨大なコード ベースのバグを修正しているときに、参照の動的な型が元のDerived
型からBase
型に変わる奇妙な状況を観察しています。問題を説明するための最小限のコードを提供しています。
struct Base {
// some 'virtual' function
protected: // copy constructor
private: // assignment operator
};
struct Derived : Base {
... // There are few more classes between `Base` and `Derived`
... // but for simplicity, I have put direct relation
};
void foo (Base &ref)
{
SomeClass obj;
obj.pVoid = &ref; // pVoid is of void*
// ----> typeid(ref) = Derived
(*funcptr)(obj);
// ----> typeid(ref) = Base !!!
Derived *p = dynamic_cast<Derived*>(&ref); // this fails ... i.e. "p = 0"
}
funcptr
は関数ポインタ ( void (*)(SomeClass&)
) です。 funcptr
非常に多くの関数を指すことができ、独自の呼び出しフローがあるため、デバッグが困難になります。
関数ポインターを呼び出した後、 の派生型が からにref
変わるのは非常に奇妙です。作業を楽にするために、 からへのオブジェクト スライスを疑ったので、ソース コード全体をピュアとして作成し、再コンパイルしました。しかし、コンパイラエラーはありませんでした。つまり、宣言されるオブジェクトはありません。Derived
Base
Derived
Base
~Base()
virtual
Base
の動的タイプref
Derived
が に変更されBase
、dynamic_cast
後で失敗する潜在的な理由は何ですか?