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()的地址。