我在这里有一种情况-基本上是这样:
#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/