2012-03-21 16 views
6

Mam obiekt klasy RTSG :: XML3D :: OpenGLMeshMA. Kiedy zatrzymał się na przerwania w swojej metodzie RTSG :: XML3D :: OpenGLMeshMA :: onXflowStateChanged dodam następujące wyrażenia w oknie Watch:Dlaczego rzutowanie adresu obiektu na tę samą klasę, co ta, wskazuje na wynik innej wartości obiektu?

enter image description here

Jak to możliwe, że surowe adres obiektu do lanego ten sam typ wskaźnika, co powoduje, że inny obiekt (obiekty i członkowie uniqieId mają różne wartości w pierwszym i drugim wierszu)?

Informacje o systemie: VS 2008 3.5 SP1, Win 7 64-bit.

+0

Zgaduję, chociaż nie mogę znaleźć dokumentacji, że to jest wewnętrzne odwołanie do obiektu. Podczas gdy twój pierwszy jest zewnętrznym odniesieniem do niego. Co tłumaczy, dlaczego możesz użyć tylko _ wewnątrz w instancji, to nie ma odniesienia zewnętrznego. –

+0

@JoshuaDrake Czym jest _wewnętrzne odniesienie_ i jak się różni od _wewnętrznego odnośnika_? To są wskaźniki, a nie odniesienia, czyż nie? –

+0

Wskaźnik jest odniesieniem w ogólnym znaczeniu. Zobacz [this (C#)] (http://msdn.microsoft.com/en-us/library/dk1507sz%28v=vs.71%29.aspx) dla wersji C#. –

Odpowiedz

0

Jedynym rozsądnym wyjaśnieniem (innym niż błąd debuggera) jest to, że używasz dziedziczenia wielokrotnego. Początek obiektu nie jest 0x0a72d4e4, jest gdzie indziej (prawdopodobnie wskaźnik wyższy lub niższy). Linia z rzutowaniem zmusza debuggera do potraktowania tego adresu jako początku obiektu i odpowiednio odczytuje złe wartości.

Przy wielokrotnym dziedziczeniu wartość "this" może być różna od adresu początku obiektu, a kompilator wstawia korekty w razie potrzeby. Jest to omówione na przykład w here, here.

+0

-1: Pokazane oba wyrażenia mają ten sam typ. Wielokrotne dziedziczenie nie może tego wyjaśnić. Nie ma czegoś takiego jak "początek obiektu" niezależnie od jego typu, ponieważ każdy obiekt może być podobiektem (w kategoriach układu) obiektu pochodnego (w terminach dziedziczenia). –

+0

Oczywiście najwyższy obiekt pokazuje ten sam typ, co obiekt w drugim wierszu. To była obsada w stylu C. – DrPizza

+0

Oczywiście, że tak. Dziedziczenie wielokrotne może wyjaśniać tylko inną interpretację tego samego wskaźnika, gdy * typ * jest inny. Załóżmy, że "this" jest w rzeczywistości wskaźnikiem do obiektu podrzędnego OpenGLMeshMA obiektu pochodnego, który dziedziczy, praktycznie nie z wielu OpenGLMeshMA, absurdalnie, jak się wydaje. Nawet wtedy nie ma sposobu, w jaki te dwa (same) wskaźniki wskazywałyby na różne instancje obiektu OpenGLMeshMA w obiekcie. Musi być coś innego z tym IDE. –

Powiązane problemy