C++ Visual Studio 2015调试器未执行派生类虚拟函数重写?
下面是一个在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
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++中没有反省,调试引擎根本不知道
X
的定义,那么调试器将正确调用C
的Y
实现。如果发生这种情况,则无需再发出砰砰声即可获得正确的v表指针。只有C++编译器知道如何正确地进行的事情。请注意,您可以简单地帮助和使用<代码>((c*)b)->())<代码>。但当你深陷在基于接口的代码中时,并不总是很明显它是一个C*。这就是C++的危害,如果它是容易的,那么任何人都可以做到,我们现在不能做到:“@ JavaJavaMsFT”使用本机兼容模式“确实在上面的示例中修复了这个问题,但是它不能让我在实际应用中设置断点,并且似乎暗示我也会用这个选项来给出其他的东西。