我在这里有一种情况-基本上是这样:

#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中正确定义的A中的纯虚函数,因此它可以正常工作-编译也很好。

如果我这样称呼:

B::foo()


它很棒。

如果我这样称呼:

foo()


它在运行时挂起系统。为什么当函数不是静态的或类似的东西时,作用域界定运算符会改变结果?

PS:我是当场编写该代码的,没有针对此问题的编译器,因此请对错别字表示抱歉。

最佳答案

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

作用域操作员通过允许其完全绕过虚拟函数查找来更改该调用。

关于c++ - 范围界定运算符是否改变了幕后的情况?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7165930/

10-11 15:11
查看更多