2014-10-28 24 views
2

,我有以下的东西作为一个非常大的代码库的一部分:C++虚函数连接古怪

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++标准的理解是,这是有效的代码和FooObjectChanged()没有任何将被称为两次doSomething()运行时出错。

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

如果我删除MainStuff :: FooObjectChanged()(body和它的声明),我会期望链接器失败并抱怨抽象类。它不是。它链接,然后程序崩溃的第一个电话虚拟功能与

libc++abi.dylib: Pure virtual function called! 

这是怎么回事?什么可能导致这些问题? FooObserver不是任何其他的基类,只是MainStuff的基类。

+0

构造函数不应该是一个纯虚函数!它也不应该是一个虚拟功能! – Steve 2014-10-28 03:13:16

+0

你的意思是构造函数?这在C++中甚至不是虚拟的,所以它们都不在这个应用程序中。 – pramparam 2014-10-28 03:28:31

+0

你是直接还是间接地从*构造函数中调用*?此外,“干净”,看看它是否继续崩溃。 – 2014-10-28 03:39:41

回答

0

原来这是XCode的一些问题。由于某种原因,它停止重新编译一些源文件。从DerivedData文件夹中删除所有内容并重新启动XCode后,代码将按照我的预期进行编译,链接和运行。

0
  1. 检查是否有任何其他的纯虚函数从其他基类继承的MainStuff和你没有覆盖MainStuff
  2. 检查DoSomething的是呼吁一个有效的对象,它是活的范围内(不同时MainStuff::doSomething()已被调用并处理中)
+0

所有其他纯虚函数都在MainStuff中重写,并且我没有发现使用它们的任何问题。 MainStuff处于活动状态并处于范围内。 – pramparam 2014-10-28 03:22:07

+0

@pramparam然后尝试重新编译整个代码,应该没问题,没有看到您发布的代码段存在任何问题 – 2014-10-28 08:13:02