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

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

enter image description here

最佳答案

这似乎只是 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/

相关文章:

指向以模板作为参数的函数的 C++ 函数指针

c++ - 如何让 MatLab 找到 Visual C++ 编译器?

sql-server - 由 Visual Studio 启动的具有高 CPU 使用率的单独 SQL 服务器实例

visual-studio-2012 - 在现有 Visual Studio 网站项目中使用 TypeScript

c++ - 当不相关的类型定义为别名时,对函数的调用是不明确的

C++ 初始化成员初始化列表中的指针

visual-studio - 为什么 VS2012 认为我的命令键是我在尝试编辑代码?

python - python中的多个构造函数,使用继承

class - Lua 中的继承是基于原型(prototype)的还是基于类的?

java - 如何从另一个继承类调用 super 构造函数?