我遇到了一个看起来很烦人的错误,该错误在Microsoft Visual C++ 2003下运行我的C++程序,但是这可能是我做错了,所以我想把它扔在这里,看看是否有人有任何想法。
我有一个这样的类层次结构(完全是这样-例如,在实际代码中没有多重继承):
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();
}
好的,所以我用“CMotionWalk”实例调用“AnnoyingFunctionThatBreaks”(例如,调试器说它是0x06716fe0),一切似乎都很好。但是当我进入它时,到“DoStuff”调用的断点处,“this”指针与我调用该方法的pMotion指针具有不同的值(例如,现在调试器说出一个高个字-0x06716fe4)。
用不同的措词:
pMotion的值为0x06716fe0,但是当我在其上调用一个方法时,该方法将“this”视为0x06716fe4。
我不只是要发疯吗?那很奇怪,对吧?
最佳答案
我相信您只是在看到编译器构建vtable的方式的假象。我怀疑CMotion本身具有虚拟功能,因此最终会在派生对象内产生偏移量,从而到达基础对象。因此,不同的指针。
如果它正在工作(即,如果这不会产生崩溃,并且对象外部没有指针),那么我就不必为此太担心。
关于c++ - C++ “this”与对象方法不匹配被调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/669105/