2014-01-17 38 views
0

我有一段代码堆栈溢出异常,无法找到原因

public class A 
    { 
     public A() 
     { 
      Console.WriteLine("A"); 
     } 
     B b = new B("From A"); 
    } 
    public class B : A 
    { 
     public B() 
     { 
      Console.WriteLine("B"); 
     } 
     public B(string str) //Getting exception here 
     { 
      Console.WriteLine("In B " + str); 
     } 
    } 
    public class C : A 
    { 
     B b = new B("From C"); 
     public C() 
     { 
      Console.WriteLine("C"); 
     } 
    } 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      new C(); 
      Console.ReadKey(); 
     } 
    } 

在这里,我知道,所有的属性都被初始化称为基本构造第一之前,但我找不到为什么我收到#1例外。任何帮助?感谢

回答

10

由于B,从A继承,它继承了

B b = new B("From A"); 

字段。所以,无论何时创建B对象,它都会在无限递归链中创建另一个B对象。

因此,在实际的程序中,您创建了一个C对象。然后使用带字符串的重载(“From C”)构造一个B对象。然后,您会在该构造函数上得到一个异常,因为它会递归地创建无限B对象。

+0

哦!你是对的。我多么想念那谢谢 –

4

递归无限循环:

  • 创建A B每一次,你创建一个新的A(通过继承)。
  • 每次创建A时,都会创建一个新的B(通过变量b)。
0

由于B从A

//公共B类继承:一个

而当你在A级创建B的对象,它会在递归无限循环

+0

已经在下面回答。 –

0

上面的问题是由于循环实例化。

这里我们对实例化的思考会导致这些问题: 在这里,当我们实例化C时,我们只是没有得到类C的对象,但实际上它是C + B + A的组合。

这些类型的问题可以很容易地通过使用箭头从实例化对象到实例化对象绘制对象图来识别。