2014-10-28 30 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