2012-02-28 79 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()来获得一个...但是它之前会更快。如果编译器做了一些优化,那么我也不会感到惊讶。

你需要添加一些突破你的递归循环的方式。