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对象上调用)。