为什么两个构造函数都被调用?

时间:2018-08-11 05:10:37

标签: c# oop

在下面的代码中,我创建了一个B类的对象,因此仅应打印B的构造函数。为什么同时打印A和B?

namespace CodeTester
{
    class Program
    {
        public static void Main(string[] args)
        {
            A a = new B();

            Console.ReadLine();
        }
    }

    class A
    {
        public A()
        {
            Console.WriteLine("A");
        }
    }

    class B : A
    {
        public B()
        {
            Console.WriteLine("B");
        }
    }

    class C : B
    {
        public C()
        {
            Console.WriteLine("C");
        }
    }
}

输出:

A
B

4 个答案:

答案 0 :(得分:1)

由于B继承自A,因此它将隐式转换为A。所以...

A a = new B()

创建一个新的B对象,然后将其强制转换为A对象。

看到“ A”和“ B”两个输出的原因是B正在调用A构造函数。使用无参数的构造函数,不必显式调用: base(),但它仍在发生,因此需要输出。

总是在子类构造函数的方法主体之前调用基类构造函数。如果您在构造函数中有参数,那么这对您将更加明显,并且您必须显式调用base。实际上,C#不会让您将其写出来,并且您也无法“看到”它。

答案 1 :(得分:1)

这就是C#的工作方式。

由于B继承自A,因此变量a是类B的实例,也是类A的实例。 / p>

在C#中,这意味着按照抽象的顺序,从最通用的类​​(A)到最具体的类(B)调用这两个构造函数。

这就是为什么要先在控制台中获得“ A”然后再获得“ B”的原因。

希望这会有所帮助。

答案 2 :(得分:0)

这是继承的一个例子。

Now when you call A a=  new B(); 

在上面的语句中,实际上创建了B类对象。什么是B级? B是A + B特有的一些其他功能的组合。

现在,当您创建B的实例时,它需要处于A状态且处于有效状态的B。像变量或其他初始化。所以首先要做的是A被调用,然后B被调用。

答案 3 :(得分:0)

如果要在下一个继承中重写Constructor函数,请这样编写

class Program
    {
        static void Main(string[] args)
        {
            A a = new B();
        }
    }


public class A
{

    public A()
    {
        DoIt();
    }

    public virtual void DoIt()
    {
        Console.WriteLine("A");
    }
}

public class B:A
{

    public B()
    {

    }

    public override void DoIt()
    {
        Console.WriteLine("B");
    }
}

此输出:

enter image description here