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

C# 为什么两个构造函数都被调用?,c#,oop,C#,Oop,在下面的代码中,我正在创建一个类B的对象,因此只有B的构造函数应该打印。为什么A和B都要打印 namespace CodeTester { class Program { public static void Main(string[] args) { A a = new B(); Console.ReadLine(); } } class A {

在下面的代码中,我正在创建一个类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

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

A a = new B()
创建一个新的
B
对象,然后将其转换为
a
对象

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

基类构造函数总是在子类构造函数的方法体之前调用。如果您的构造函数中有参数,并且必须显式调用
base
,这对您来说会更明显。事实上,C#不能让你把它写出来,你也看不到它。

这就是C#的工作原理


由于
B
继承自
A
,因此变量
A
既是类
B
的实例,也是类
A
的实例

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

这就是为什么您首先在控制台中得到“A”,然后是“B”


希望这有帮助。

这是一个继承的例子

Now when you call A a=  new B(); 
在上面的语句中,实际上创建了类B对象。什么是B级?B是A+特定于B的一些其他功能的组合


现在,当您创建B的实例时,它需要处于有效状态的A中的任何内容。比如变量或其他初始化。所以要做到这一点,首先调用A get,然后调用B get。

如果您想在下一个继承中重写构造函数,请这样编写

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");
    }
}
此输出:


因为B继承自A。继承不重写构造函数