2012-02-28 81 views
2
#include<iostream> 
using namespace std; 

class A 
{ 
public: 

virtual void f() = 0; 
}; 

class B: public A 
{ 
public: 

void f() 
{ 
// f(); //segmentation Fault 
cout<<"\bB's f() called"<<endl; 
f(); //recursive loop 
} 
}; 

void A:: f() 
{ 
cout<<"\nA's f() called"<<endl; 
} 

    int main() 
    { 

    A *ptr; 
    B b; 

    ptr = &b; 
    b.f(); 

    return 0; 
    } 

Q->在這個問題..在B級F()內,如果我們之前調用f()的「COUT < <」的聲明它給分段錯誤和cout <後」 <「聲明它給出遞歸循環。爲什麼會出現分段錯誤。感謝提前:)爲什麼分段錯誤即將

+0

你期待什麼發生? – Mat 2012-02-28 15:20:11

+0

我的猜測是,問題不在於爲什麼他得到堆棧溢出 - 問題似乎是爲什麼他根據遞歸調用的位置得到不同的結果。 – Till 2012-02-28 15:22:14

回答

2

cout<<原因f()配售f()到第一cout<<發生之前被稱爲遞歸的無數次的量。你的兩個問題在概念上都是一樣的,但是提供不同的輸出。

+1

差異的原因是第二種情況下的編譯器優化。通常情況下,遲早會由於堆棧溢出而導致段錯誤。 – 2012-02-28 15:21:45

0

遞歸循環問題的原因。它永遠不會,並且調用堆棧將填滿。

你錯過了一個暫停條件。

0

由於無限循環,您正在獲取一個計算器。你最終還可以在cout < <之後調用f()來獲得一個...但是它之前會更快。如果編譯器做了一些優化,那麼我也不會感到驚訝。

你需要添加一些突破你的遞歸循環的方式。