2012-03-21 4 views
6

私は、クラスRTSG :: XML3D :: OpenGLMeshMAのオブジェクトを持っています。その方法でのブレークポイントで停止するとRTSG :: XML3D :: OpenGLMeshMA :: onXflowStateChanged私は、ウォッチウィンドウに次の式を追加します。オブジェクトのアドレスをこのクラスと同じクラスにキャスティングすると、別のオブジェクト値が返されるのはなぜですか?

enter image description here

がどのようにオブジェクトの生のアドレスがキャストにすることを可能これと同じポインタ型は、異なるオブジェクトになります(オブジェクトおよびuniqieIdメンバは1行目と2行目で異なる値を持ちます)。

システム情報:VS 2008 3.5 SP1、Win 7 64ビット。

+0

私はそれについてのドキュメントを見つけることはできませんが、これはオブジェクトの内部参照であると思います。あなたの最初はそれへの外部参照です。これは、インスタンス内で_this_のみを使用できる理由を説明し、外部参照はありません。 –

+0

@ JoshuaDrake _internal reference_とは何ですか?それは_external reference_とどう違うのですか?これらはポインタであり、参照ではありません。 –

+0

ポインタは一般的な意味での参照です。 C#のバージョンについては、[this(C#)](http://msdn.microsoft.com/en-us/library/dk1507sz%28v=vs.71%29.aspx)を参照してください。 –

答えて

0

唯一合理的な説明(デバッガのバグ以外)は、複数の継承を使用していることです。オブジェクトの開始点は0x0a72d4e4ではありません。それは別の場所です(ポインタが高いか低いかもしれません)。キャストされた行は、デバッガにそのアドレスをオブジェクトの先頭として扱わせ、それによって不正な値を読み取るようにします。

複数の継承では、 'this'の値はオブジェクトの開始アドレスと異なる場合があり、コンパイラは必要に応じて調整を挿入します。それは、例えば、 here,here

+0

-1:表示される両方の式のタイプが同じです。多重継承はそれを説明できません。どんなオブジェクトも(継承用語で)派生オブジェクトのサブオブジェクト(レイアウト用語で)になる可能性があるため、そのタイプに関係なく「オブジェクトの開始」というようなものはありません。 –

+0

もちろん、先頭のオブジェクトは2行目のオブジェクトと同じタイプを示します。それはCスタイルのキャストでした。 – DrPizza

+0

もちろんです。また、複数の継承は、* type *が異なるときに同じポインタの異なる解釈しか説明できません。 "this"は、事実上、複数のOpenGLMeshMAから非仮想的に継承した派生オブジェクトのOpenGLMeshMAサブオブジェクトへのポインタであると思われます。それでも、2つの(同じ)ポインタがオブジェクト内のOpenGLMeshMAの異なるインスタンスをどのように指しているかはまったくありません。このIDEに何か他のことが起こっているに違いありません。 –

関連する問題