我有一个情况 - 基本上:
#include <iostream>
class A {
public:
virtual void foo()=0;
};
class B : A {
public:
void foo() { cout << "I hate this code." << endl; }
void DoSomething() { /* Code */ }
};
在我的情况下,A和B在不同的文件中,不用说更复杂 - 但这是我的问题:
在函数中的B类中的某个地方(比如DoSomething()),我称之为foo。现在,foo是B中正确定义的纯虚函数,所以它工作正常 - 编译也很好。
如果我称之为:
B::foo()
效果很好。
如果我称之为:
foo()
它在运行时挂起系统。为什么范围操作员会在函数不是静态的时候改变结果,或者无论如何都会改变结果?
PS:我当场编写了这段代码并且没有针对这个问题的编译器,所以很抱歉打字错误。
答案 0 :(得分:3)
代码看起来正确。这强烈暗示vptr或vtable已被某些超出范围的内存访问损坏,或者this
指针无效。
作用域操作符允许它完全绕过虚函数查找来更改调用。