Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么vptr(虚拟表指针)指向错误的函数_C++ - Fatal编程技术网

C++ 为什么vptr(虚拟表指针)指向错误的函数

C++ 为什么vptr(虚拟表指针)指向错误的函数,c++,C++,我的班级结构如下: class CLASS_EXPORT A { public: virtual bool foo1(); virtual bool foo2(); }; class CLASS_EXPORT B: public A{ public: B(); virtual bool foo1(); }; int main() { B b; } 这些类位于一个dll中。当我查看对象“b”的虚拟指针时,它没有

我的班级结构如下:

class CLASS_EXPORT A
{
public:
    virtual        bool foo1();
    virtual        bool foo2();
};

class CLASS_EXPORT B: public A{
public:
    B();
    virtual        bool foo1();
};

int main()
{
    B b;
}
这些类位于一个dll中。当我查看对象“b”的虚拟指针时,它没有显示foo2()函数的条目。它显示foo1()的条目,以及与另一个dll中的不同类完全不同的条目

我正在使用Visual studio 2015并使用quick watch查看“this”指针。此外,在调试生成上调试时,控件会转到错误的函数。在为此调试汇编代码时,基类构造函数在基类的指针内分配了错误的vtable指针

00007FFA6323E6CB lea rcx,[A::`vftable'(07FFA634422CB8H)]

如果我检查at 07FFA634422CB8H的值,它会显示不正确的函数指针

你能帮我弄清楚是什么引起的吗


谢谢

这并不少见;这是“好像规则”允许的。在C++中,有些东西有在语言层可见的地址,而其他事物只有在实现的时候才有地址。对于第一种情况,一般规则是,如果可以比较地址,不同的事物必须有不同的地址。但是vtables在语言级别上是不可见的,它们只有一个地址,因为VisualStudio认为这在内部是方便的。没有任何东西限制VisualStudio对地址的选择。代码只需要按照C++标准的规则运行,而且这并不能说明调试器的任何功能。问题是,为什么某些特定的工具给你的信息不正确。但你甚至都不说你在问什么工具。这闻起来像是一个。你为什么要关注VTHT的内容?抱歉,信息不足,我已经编辑了原始的PASTH这个问题是困扰你自己的内部实现细节的后果,同时假设它们将匹配你的C++教科书中的措辞(教科书的作者不理解抽象)。当然,这并不是一个坏问题:)+1“控件转到了错误的函数”,但它真的吗?;)“您不能编写
&A::foo1==&B::foo1
”-但您可以。你的意思是说结果是未指定的吗?@StoryTeller UnslanderMonica:对-我忽略了在这个例子中类是相关的(通过继承)
void(A::*)()
void(B::*)()
共享一个公共类型,即
void(B:*)()
(这有点违反直觉,但A的每个方法都可以在B对象上调用)。