这是观察虚函数表的源码:
#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 << endl;”声明,然后我发现虚函数表中没有出现成员函数“func2”,只有Base::func()和Derived::~Derived()。
最佳答案
这似乎只是 Visual Studio 方面的一个错误或奇怪的行为。
如果您右键单击 __vfptr
成员并在上下文菜单中使用“添加监视”命令,您最终会得到一个监视 (*((Base*)(&( d)))).__vfptr,nd
,显示相同。
即使您将其更改为 (*((Derived*)(&(d)))).__vfptr,nd
,或者只是将其更改为 d.__vfptr
重要的是,它仍然显示相同,即使 Derived 的 vtable 更大。
您需要像这样明确指定元素数量为 3,以便最终显示表格的其余部分和您的函数:d.__vfptr,3
关于c++ - 在虚函数表中找不到派生类的虚函数地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23154005/