作为大型代码库的一部分,我有以下内容:
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
中覆盖MainStuff::doSomething()
并在处理过程中不会销毁)