这是观察虚函数表的源代码:
#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()。
答案 0 :(得分:1)
这似乎只是Visual Studio的一个错误或奇怪的行为。
如果您右键点击__vfptr
成员并使用&#34;添加观看&#34;在上下文菜单中,您最终得到一个手表(*((Base*)(&(d)))).__vfptr,nd
,显示相同的内容。
即使您将其更改为(*((Derived*)(&(d)))).__vfptr,nd
,或仅将其更改为d.__vfptr
,它仍会显示相同的内容,即使Derived的vtable更大。
您需要明确指定元素数量为3,以便最终显示表格的其余部分和您的函数:d.__vfptr,3