Mi sono imbattuto in quello che sembra un bug davvero fastidioso che esegue il mio programma C++ in Microsoft Visual C++ 2003, ma potrebbe essere solo qualcosa che sto facendo male Lo butterei qui e vedrei se qualcuno ha qualche idea.C++ "questo" non corrisponde al metodo dell'oggetto è stato chiamato su
Ho una gerarchia di classi come questo (esattamente come è - per esempio non c'è ereditarietà multipla nel codice reale):
class CWaitable
{
public:
void WakeWaiters() const
{
CDifferentClass::Get()->DoStuff(this); // Breakpoint here
}
};
class CMotion : public CWaitable
{
virtual void NotUsedInThisExampleButPertinentBecauseItsVirtual() { }
};
class CMotionWalk : public CMotion
{ ... };
void AnnoyingFunctionThatBreaks(CMotion* pMotion)
{
pMotion->WakeWaiters();
}
Va bene, così io chiamo "AnnoyingFunctionThatBreaks" con un'istanza "CMotionWalk" (ad esempio il debugger dice che è 0x06716fe0), e tutto sembra a posto. Ma quando ci passo, al punto di interruzione della chiamata a "DoStuff", il puntatore "this" ha un valore diverso rispetto al puntatore pMotion su cui ho chiamato il metodo (ad esempio, il debugger dice una parola più alta - 0x06716fe4).
Per esprimerlo in modo diverso: pMotion ha il valore 0x06716fe0, ma quando chiamo un metodo su di esso, quel metodo vede 'questo' come 0x06716fe4.
Non sto diventando matto, vero? È strano, vero?
Il taglio avviene sugli oggetti e non sui puntatori. Il codice che hai postato funziona dopo un piccolo aggiustamento. Pubblica un codice reale - la mia sfera di cristallo non funziona oggi. A proposito: non hai intenzione di passare "questo" in giro, vero? – dirkgently
Questa è quasi certamente un'eredità multipla: l'esempio di codice è stato probabilmente sovradimensionato. –
@Earwicker: Da dove hai ereditato multipli? – dirkgently