作为大型代码库的一部分,我有以下内容:

class FooObserver {
public:
     virtual void FooObjectChanged() = 0;
};

class MainStuff :  public FooObserver ... /* a long list of other base classes */ {
    /* a pretty big class with many things in it */
public:
    /* ... */
    void FooObjectChanged();
    void doSomething();
};

void MainStuff::doSomething() {
    this->FooObjectChanged();
    FooObserver* o = this;
    o->FooObjectChanged();

}

void MainStuff::FooObjectChanged() {
    std::cout << "object changed\n";
}

我对C++标准的理解是,这是有效的代码,当doSomething()运行时,FooObjectChanged()将被调用两次而不会出现任何错误。

但是在我的应用程序中,第二次调用失败。 (segfault,或更确切地说是iOS上的EXC_BAD_ACCESS)

如果删除MainStuff::FooObjectChanged()(主体及其声明),则我希望链接器因抱怨抽象类而失败。它不是。它链接,然后程序在第一次调用虚拟函数时崩溃,
libc++abi.dylib: Pure virtual function called!

到底是怎么回事?是什么引起这些问题? FooObserver并不是MainStuff的其他任何基类。

最佳答案

  • 检查MainStuff中是否还有从其他基类继承的其他纯虚函数,并且您没有在MainStuff中覆盖
  • 检查doSomething是在有效且处于范围内的有效对象上调用的(在调用MainStuff::doSomething()并在处理过程中不会销毁)
  • 10-08 02:45