范围界定运营商会改变封面下发生的事情吗?

时间:2011-08-23 18:40:01

标签: c++ virtual-functions

我有一个情况 - 基本上:

#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:我当场编写了这段代码并且没有针对这个问题的编译器,所以很抱歉打字错误。

1 个答案:

答案 0 :(得分:3)

代码看起来正确。这强烈暗示vptr或vtable已被某些超出范围的内存访问损坏,或者this指针无效。

作用域操作符允许它完全绕过虚函数查找来更改调用。