在虚函数表中找不到派生类的虚函数地址

时间:2014-04-18 12:19:42

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

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

#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&lt;&lt; endl;”声明,然后我发现成员函数“func2”没有出现在虚函数表中,只有Base :: func()和Derived :: ~Derived()。

enter image description here

1 个答案:

答案 0 :(得分:1)

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

如果您右键点击__vfptr成员并使用&#34;添加观看&#34;在上下文菜单中,您最终得到一个手表(*((Base*)(&(d)))).__vfptr,nd,显示相同的内容。

即使您将其更改为(*((Derived*)(&(d)))).__vfptr,nd,或仅将其更改为d.__vfptr,它仍会显示相同的内容,即使Derived的vtable更大。

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