堆栈溢出异常,无法找到原因

时间:2014-01-17 13:05:40

标签: c# inheritance

我有一段代码

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();
        }
    }

在这里,我知道在调用基础构造函数之前首先初始化所有属性,但是我无法找到为什么我得到Stackoverflow异常。任何帮助?感谢

4 个答案:

答案 0 :(得分:10)

因为B继承自A,所以它继承了

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

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

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

答案 1 :(得分:4)

递归无限循环:

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

答案 2 :(得分:0)

由于B继承自A

  

//公共类B:A

当你在A类中创建B的对象时,它进入递归无限循环

答案 3 :(得分:0)

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

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

通过从实例化对象到实例化对象绘制带箭头的对象图,可以轻松识别这类问题。