C++ 范围界定操作员是否会改变封面下的内容?
我这里有一个情况——基本上:C++ 范围界定操作员是否会改变封面下的内容?,c++,virtual-functions,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 */ } }; 它工作得很好 如
#include <iostream>
class A {
public:
virtual void foo()=0;
};
class B : A {
public:
void foo() { cout << "I hate this code." << endl; }
void DoSomething() { /* Code */ }
};
它工作得很好
如果我这样称呼它:
B::foo()
foo()
它在运行时挂起系统。当函数不是静态的或类似的东西时,为什么作用域操作符会改变结果
PS:我当时就写了那段代码,但没有编译器来回答这个问题,所以如果有拼写错误,我很抱歉。代码看起来是正确的。这强烈意味着vptr或vtable已被某些越界内存访问损坏,或者
此
指针无效
作用域运算符通过允许调用完全绕过虚拟函数查找来更改调用。代码看起来正确。这强烈意味着vptr或vtable已被某些越界内存访问损坏,或者
此
指针无效
作用域运算符通过允许调用完全绕过虚拟函数查找来更改调用。哇,它挂起了整个系统?发布的代码无法重现该问题。发布能够重现问题的最小代码。你真正的代码将非常重要。也许您是从一个更派生的类调用
DoSomething
,其中foo
再次被重写(并挂起)。这非常奇怪。首先,我要确保你做了一个干净的构建。如果问题仍然存在,您应该逐步进行反汇编,看看实际的区别是什么。如果您不显示代码,那么您如何期待帮助?哇,它挂起了整个系统?发布的代码无法重现该问题。发布能够重现问题的最小代码。你真正的代码将非常重要。也许您是从一个更派生的类调用DoSomething
,其中foo
再次被重写(并挂起)。这非常奇怪。首先,我要确保你做了一个干净的构建。如果问题仍然存在,您应该分步进行反汇编,看看实际的区别是什么。如果您不显示代码,那么您如何期待帮助?谢谢,这是完全可能的,因为我们有大量的进程和大量的动态内存使用。也许我们运行了一个数组,这正是显示效果的地方。谢谢,这是完全可能的,因为我们有大量的进程和大量的动态内存使用。也许我们超过了一个数组,这正是显示效果的地方。