2012-03-21 11 views
6

Ho un oggetto della classe RTSG :: XML3D :: OpenGLMeshMA. Quando fermato al punto di interruzione nel suo metodo RTSG :: XML3D :: :: OpenGLMeshMA onXflowStateChanged aggiungo le seguenti espressioni nella finestra Watch:Perché l'oggetto di cast della stessa classe come questo punta a risultati in un altro valore dell'oggetto?

enter image description here

Come può essere che l'indirizzo grezzo dell'oggetto colato in lo stesso tipo di puntatore come risultato in un oggetto diverso (i membri object e uniqieId hanno valori diversi nella prima e nella seconda riga)?

Informazioni sull'impianto: VS 2008 3.5 SP1, Win 7 64-bit.

+0

Direi, anche se non riesco a trovare la documentazione per questo, che questo è il riferimento interno all'oggetto. Mentre il tuo primo è il riferimento esterno ad esso. Questo spiega perché puoi usare _questo_ all'interno di un'istanza, non ha riferimenti esterni. –

+0

@JoshuaDrake Che cos'è _ riferimento interno_ e in che modo è diverso da _external reference_? Questi sono puntatori, non riferimenti, no? –

+0

Un puntatore è un riferimento in senso generale. Vedere [questo (C#)] (http://msdn.microsoft.com/en-us/library/dk1507sz%28v=vs.71%29.aspx) per la versione C#. –

risposta

0

L'unica spiegazione ragionevole (diverso da un bug debugger) è che si sta utilizzando l'ereditarietà multipla. L'inizio dell'oggetto non è 0x0a72d4e4, è da qualche altra parte (probabilmente un puntatore più in alto o più in basso). La linea con il cast sta forzando il debugger a trattare quell'indirizzo come l'inizio dell'oggetto, e di conseguenza sta leggendo valori errati.

Con ereditarietà multipla, il valore di 'questo' può essere diverso dall'indirizzo di inizio dell'oggetto, e il compilatore inserisce modifiche necessarie. È discusso ad es. here, here.

+0

-1: entrambe le espressioni mostrate hanno lo stesso tipo. L'ereditarietà multipla non può spiegarlo. Non esiste una cosa come "inizio dell'oggetto" indipendente dal suo tipo, in quanto qualsiasi oggetto può essere un sottooggetto (in termini di layout) di un oggetto derivato (in termini di ereditarietà). –

+0

Ovviamente l'oggetto in alto mostra lo stesso tipo dell'oggetto nella seconda riga. È stato un cast in stile C. – DrPizza

+0

Certo che lo fa. E l'ereditarietà multipla può solo spiegare una diversa interpretazione dello stesso puntatore quando il * tipo * è diverso. Supponiamo che "questo" sia in realtà un puntatore al subobject OpenGLMeshMA di un oggetto derivato che eredita, non virtualmente, da più OpenGLMeshMA, assurdo come sembra. Anche allora, non c'è modo in cui i due (stessi) puntatori punterebbero a diverse istanze di OpenGLMeshMA all'interno dell'oggetto. Deve esserci qualcos'altro che sta accadendo a questo IDE. –