2012-11-09 73 views
2

我有一個基類A,我與X延長。在A裏面還有另外一個類,B。似乎虛擬方法沒有被定義,但我不明白爲什麼?爲什麼這個子類代碼會導致運行時錯誤?

class A { 
public: 
    class B {public: bool value;}; 

    A() {} 
    B b_; 
    void DoStuff(B& b); 
private: 
    virtual void DoStuffImpl(B& b) = 0; 
}; 

class X : public A { 
public: 
    X() {} 
    void Trigger(); 
private: 
    virtual void DoStuffImpl(B& b); 
}; 

void A::DoStuff(B& b) { 
    DoStuffImpl(b); 
} 

void X::Trigger() { 
    DoStuff(b_); 
} 
void X::DoStuffImpl(B& b) { 
    b.value = true; 
} 

int main(){ 
    X x; 
    x.Trigger(); 
    return x.b_.value; 
} 

附:在此之前,因爲我有我的代碼不同的問題,但我不能甚至使這個玩具例如工作,所以現在我有這個讓我好奇....

這裏是上述代碼的鏈接,這是編譯和失敗運行:http://ideone.com/mBJ1Kg

+0

如果不運行,它不會導致運行時錯誤。 –

+0

順便說一句,你應該初始化'bool'成員。 –

回答

7

運行良好。 ideone報告退出代碼爲1的「運行時錯誤」,因爲您從main返回1。通常認爲非零返回碼是失敗的。

如果您註釋掉你return x.b_.value線,並與return 0然後​​替換它。

你可能已經把一些std::cout線在那裏,看看發生了什麼事情,看看該程序的作品! :D

+0

當你說得對!我非常大的C++程序無法編譯,因爲它無法在我的'X :: HelperFunction(B&b)'中找出'B'。但我似乎無法創建一個具有相同行爲的玩具示例....無論如何,謝謝 –

+0

@RobertMartin:'RESOLVED/OOPS_BROKEN_TESTCASE' :) –

+1

yup。讓我溜走並製作另一個玩具。視頻相關:http://www.youtube.com/watch?v = FnjfuKVCHFw –

相關問題