c++ - 范围界定运算符是否会改变幕后发生的事情?

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

如果我这样调用它:

B::foo()

效果很好。

如果我这样调用它:

foo()

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

PS:那段代码是我当场写的,没有编译器可以解决这个问题,如果有错别字,请见谅。

最佳答案

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

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

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

相关文章:

c++ - C++ 中的虚函数和模板——它们可以被其他(C++ 中存在的)操作替换吗?

c++ - 大多数派生类如果未实现虚函数则无法编译,但如果一个基类未实现虚函数则可以编译

c++ - 使用 C++11 使用 Futures 和 Promises 实现双缓冲

c++ - 将 C++ .exe 与 C++ : C++ception 一起使用

c++ - CPP int 到语句问题中的字符串

c++ - gcc 6.1 可执行文件链接错误

C++调用对象的完全错误(虚拟)方法

c++ - 虚函数输出奇怪的值

c++ - 为什么我必须在基类中定义虚函数?

c++ - 在析构函数中删除指针时崩溃