C++ Visual Studio 2015调试器未执行派生类虚拟函数重写?

C++ Visual Studio 2015调试器未执行派生类虚拟函数重写?,c++,visual-studio-2015,virtual-functions,C++,Visual Studio 2015,Virtual Functions,下面是一个在Visual Studio 2015中测试的最小工作示例: class A { virtual void X() {} }; class B : public A { public: virtual bool Y() { return false; } }; class C : public B { public: virtual bool Y() override { return true; } }; int main() { B* b = new

下面是一个在Visual Studio 2015中测试的最小工作示例:

class A
{
   virtual void X() {}
};

class B : public A
{
public:
   virtual bool Y() { return false; }
};

class C : public B
{
public:
   virtual bool Y() override { return true; }
};

int main()
{
   B* b = new C;

   bool result = b->Y();
}
result
的值如预期的那样为
true
。但是,监视表达式
b->Y()
的计算结果为
false

如果我注释掉上面类
A
中的虚拟函数
X
,则在watch表达式中计算的
result
b-Y()
都是
true


在我看来,调试器评估引擎只考虑继承链中最顶层的虚拟表。。。这是正确的吗?我能做些什么来解决这个问题吗?< /P> C++中没有反省,调试引擎根本不知道b>代码>实际上是C*。只有一个C++编译器才能得到这个权限,调试器没有内置的。请不要把时间浪费在微软员工愚蠢的回答上。@Hans Passant,很抱歉,如果我提供了错误的答案,我只是在我身边重新编写,我得到的结果与Micah相同,但如果我启用“使用本机兼容模式”,则监视窗口中的b-Y()值为真。我不太确定这是否是调试器选项的问题,但我同意你的看法,VC++会更好地解决这个问题。谢谢您的反馈。@HansPassant如果我注释掉了
X
的定义,那么调试器将正确调用
C
Y
实现。如果发生这种情况,则无需再发出砰砰声即可获得正确的v表指针。只有C++编译器知道如何正确地进行的事情。请注意,您可以简单地帮助和使用<代码>((c*)b)->())<代码>。但当你深陷在基于接口的代码中时,并不总是很明显它是一个C*。这就是C++的危害,如果它是容易的,那么任何人都可以做到,我们现在不能做到:“@ JavaJavaMsFT”使用本机兼容模式“确实在上面的示例中修复了这个问题,但是它不能让我在实际应用中设置断点,并且似乎暗示我也会用这个选项来给出其他的东西。