He encontrado lo que parece ser un error realmente molesto ejecutar mi programa C++ bajo Microsoft Visual C++ 2003, pero podría ser algo que estoy haciendo mal, así que pensé Lo lanzaría aquí y vería si alguien tiene alguna idea.C++ "esto" no coincide con el método de objeto fue llamado en
que tienen una jerarquía de clases de este tipo (tal y como es - por ejemplo, no hay herencia múltiple en el código real):
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();
}
bien, así que llaman "AnnoyingFunctionThatBreaks" con una instancia de "CMotionWalk" (por ejemplo, el depurador dice que es 0x06716fe0), y todo parece estar bien. Pero cuando entro en él, al punto de interrupción en la llamada a "DoStuff", el puntero "this" tiene un valor diferente al puntero pMotion al que puse el método (por ejemplo, ahora el depurador dice una palabra más arriba - 0x06716fe4).
Para expresarlo de manera diferente: pMotion tiene el valor 0x06716fe0, pero cuando invoco un método en él, ese método ve 'esto' como 0x06716fe4.
No me estoy volviendo loco, ¿verdad? Eso es raro, ¿verdad?
El corte ocurre en objetos y no en punteros. El código que publicaste funciona después de un pequeño arreglo. Publica un código real: mi bola de crystall no funciona hoy. Por cierto: realmente no tienes la intención de pasar 'esto', ¿o sí? – dirkgently
Es casi seguro que se trata de una herencia múltiple; es probable que la muestra del código haya sido recortada en exceso. –
@Earwicker: ¿De dónde obtuviste la herencia múltiple? – dirkgently