【问题标题】:Cannot find the virtual function address of derived class in virtual function table在虚函数表中找不到派生类的虚函数地址
【发布时间】:2014-06-02 22:57:13
【问题描述】:

这是观察虚函数表的源码:

#include <iostream>
using namespace std;

class Base 
{
public:
    virtual void func() {}
    virtual ~Base() {}
protected:
    int x;
};

class Derived : public Base
{
public:
    virtual ~Derived() {}
    virtual void func2() { cout << " func2() " << endl; }
protected:
    int y;
};

int main()
{
    Base b;
    Derived d;
    cout << endl;
    return 0;
}

我使用vs2012并调试到“cout

【问题讨论】:

  • 您正在查看d -> Base -> __vfptr,但Base 的vtable 不需要/放置func2。检查你是否能找到Derived的vtable。
  • 但是只有一张表可以在 Base 和 Derived 之间共享。
  • 这是对象 d 的整个对象模型。我找不到其他 vtable。
  • @MantoshKumar 是也不是。 vtable,作为对象本身,被扩展。如果您通过Base(就像 OP 在调试器中所做的那样)查看它,您只会看到包含Base 知道的所有内容的第一部分。您需要通过Derived 查看它以查看func2 的附加插槽等。这可能意味着调试器太愚蠢而无法显示所有信息,因为vtable-ptr 存储在Base- Derived 实例的一部分,当调试器尝试显示它时,它会丢失 dDerived 的信息,因此可以使用 Derived 的 vtable。

标签: c++ visual-studio-2012 inheritance


【解决方案1】:

这似乎只是 Visual Studio 的一个错误或奇怪的行为。

如果您右键单击__vfptr 成员并在上下文菜单中使用“添加手表”命令,您最终会看到(*((Base*)(&amp;(d)))).__vfptr,nd 手表,显示相同。

即使您将其更改为 (*((Derived*)(&amp;(d)))).__vfptr,nd,或者只是 d.__vfptr,它仍然显示相同,即使 Derived 的 vtable 更大。

您需要像这样明确地将元素的数量指定为 3,以便最终显示表格的其余部分和您的函数:d.__vfptr,3

【讨论】:

  • 感谢您的热心回复,我按照这个步骤在vtable中找到了func2()的地址。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多