为什么vptr(虚拟表指针)指向错误的函数

use*_*073 0 c++

我有以下类结构:

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 处的值,它会显示不正确的函数指针

您能帮忙找出可能是什么原因造成的吗?

谢谢

MSa*_*ers 5

这种情况并不少见;这是“假设规则”允许的。在 C++ 中,某些事物的地址在语言级别可见,而其他事物的地址仅作为实现问题。首先,一般规则是,如果地址可以比较,则不同的事物必须具有不同的地址。但是 vtable 在语言级别不可见,它们只有一个地址,因为 Visual Studio 认为它在内部会很方便。没有任何东西限制 Visual Studio 对地址的选择。代码只需按照 C++ 标准的规则运行,这并没有涉及调试器。