#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-&GT;在这个问题..在B类f()内部,如果我们在“cout&lt;&lt;”之前调用f()声明它给出了分段错误并且在“cout&lt;&lt;”之后声明它给出了递归循环。为什么分段错误即将到来。在此先感谢:)
答案 0 :(得分:5)
当您在函数结束时进行递归调用时,编译器会优化您的堆栈使用,可能会消除它。见:http://en.wikipedia.org/wiki/Tail_call。分段错误的原因是stackoverflow!
答案 1 :(得分:2)
在f()
之前放置cout<<
会导致f()
在第一个cout<<
发生之前递归无限次地被称为。你的两个问题在概念上是相同的,但提供不同的输出。
答案 2 :(得分:0)
递归循环是导致问题的原因。它永远不会和,并且调用堆栈将填满。
你错过了停止状态。
答案 3 :(得分:0)
由于您的无限循环,您将获得堆栈溢出。你最终还会在cout&lt;&lt;之后调用f()。 ...但它之前更快到达那里。如果编译器做了一些影响它的优化,我也不会感到惊讶。
你需要添加一些突破你的递归循环的方法。