,我有以下的東西作爲一個非常大的代碼庫的一部分: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的基類。
構造函數不應該是一個純虛函數!它也不應該是一個虛擬功能! – Steve 2014-10-28 03:13:16
你的意思是構造函數?這在C++中甚至不是虛擬的,所以它們都不在這個應用程序中。 – pramparam 2014-10-28 03:28:31
你是直接還是間接地從*構造函數中調用*?此外,「乾淨」,看看它是否繼續崩潰。 – 2014-10-28 03:39:41