我有以下类结构:
class CLASS_EXPORT A
{
public:
virtual bool foo1();
virtual bool foo2();
};
class CLASS_EXPORT B: public A{
public:
B();
virtual bool foo1();
};
int main()
{
B b;
}
Run Code Online (Sandbox Code Playgroud)
这些类位于一个 dll 内。当我查看对象“b”的虚拟指针时,它没有显示 foo2() 函数的条目。它显示了 foo1() 的条目和另一个 dll 中不同类的完全不同的条目。
我正在使用 Visual studio 2015 并使用快速监视来查看“this”指针。此外,在调试版本上进行调试时,控件会转到错误的函数。当为此调试汇编代码时,基类构造函数在基类的 this 指针内分配了错误的 vtable 指针。
00007FFA6323E6CB lea rcx,[A::`vftable' (07FFA63422CB8h)]
如果我检查 07FFA63422CB8h 处的值,它会显示不正确的函数指针
您能帮忙找出可能是什么原因造成的吗?
谢谢
这种情况并不少见;这是“假设规则”允许的。在 C++ 中,某些事物的地址在语言级别可见,而其他事物的地址仅作为实现问题。首先,一般规则是,如果地址可以比较,则不同的事物必须具有不同的地址。但是 vtable 在语言级别不可见,它们只有一个地址,因为 Visual Studio 认为它在内部会很方便。没有任何东西限制 Visual Studio 对地址的选择。代码只需按照 C++ 标准的规则运行,这并没有涉及调试器。