C++ 在虚拟函数表中找不到派生类的虚拟函数地址
这是观察虚拟函数表的源代码:C++ 在虚拟函数表中找不到派生类的虚拟函数地址,c++,visual-studio-2012,inheritance,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()
#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;
}
#包括
使用名称空间std;
阶级基础
{
公众:
虚拟void func(){}
虚拟~Base(){}
受保护的:
int x;
};
派生类:公共基
{
公众:
虚~Derived(){}
virtual void func2(){cout这似乎只是Visual Studio方面的一个bug或奇怪行为。
如果右键单击\uuuvfptr
成员并在关联菜单中使用“添加监视”命令,则会出现一个监视(*((基本*)(&(d)))。\uuuvfptr,nd
,显示相同内容
即使您将其更改为(*((派生*)(&(d))。u vfptr,nd
,或者只是d.u vfptr
,它仍然显示相同的内容,即使派生的vtable更大
您需要明确地将元素的数量指定为3,这样它才能最终显示表的其余部分和您的函数:d.\uu vfptr,3
您正在查看的d
->Base
\uu vfptr
,但是Base
的vtable不需要/放置func2
。请检查是否可以找到Derived
的vtable。但是在基和派生之间只有一个表是共享的。这是对象d的整个对象模型。我找不到其他vtable。@MantoshKumar是和否。vtable作为对象本身是扩展的。如果您通过基查看它(就像调试器中的OP那样),您只会看到第一部分,其中包含Base
知道的所有内容。您需要通过Derived
查看它,以查看func2
等的附加插槽。这可能意味着调试器太笨了,无法显示所有信息,因为vtable ptr存储在Base
-部分中他是派生的
实例,当调试器试图显示它时,它会丢失d
是派生的
的信息,因此可以使用派生的
的vtable。感谢您的友好回复,我按照此步骤在vtable中找到了func2()的地址。