巨大なコードベースにバグを修正している間に、参照の動的タイプが元のDerived
タイプからBase
タイプに変わったという奇妙な状況が観察されています。私はこの問題を説明するために、最小限のコードを提供しています:dynamic_cast <>のどのような状況や状況で失敗する可能性がありますか?
funcptr
は、関数ポインタ(void (*)(SomeClass&)
)です。 funcptr
は非常に多くの機能を指すことができ、独自のコールフローを持っているため、デバッグは困難です。
関数ポインタの呼び出しの後で、派生型ref
がDerived
からBase
に変わるのは非常に奇妙です。私の仕事を楽にするために、私はDerived
からBase
にオブジェクトのスライスを疑ったので、~Base()
を純粋なvirtual
とし、ソースコード全体を再コンパイルしました。コンパイラエラーはありませんでした。つまり、Base
のオブジェクトが宣言されていません。
ref
Derived
の動的タイプがBase
に変更され、dynamic_cast
が後で失敗する可能性がある理由は何ですか?
typeid(ref)が呼び出しの後のベースである場合、その関数はオブジェクトを使いこなしています。あなたはオブジェクトにポインタを渡しているので、オブジェクト全体にランダムなものを書くのは非常に簡単です。 –
@ LokiAstariは、このコードは数年間安定していますが、あなたが主に言ったのは私の主な容疑者です。 'pVoid'はそれを乱すかもしれないが、私はどのような状況でそれが起こっているのか見なければならない。その前に、参照のために動的型を静的型に変更する可能性のある些細なことがないかどうかを確認したいと思いました。 – iammilind