继承过程中的构造函数调用层次——带参数和不带参数

Constructor calling hierarchy during inheritance-both with and without parameters

首先这不是一个重复的问题。

我知道以下事实:

我的问题是: 对于我下面的代码

class ClassA
{
    public ClassA(int a)
    {
        Console.WriteLine("Parameterized Constructor of ClassA");
    }
}
class ClassB : ClassA
{
    public ClassB(int a)
    {
        Console.WriteLine("Parameterized Constructor of ClassB");
    }
}
class ClassC : ClassB
{
    public ClassC(int a)
    {
        Console.WriteLine("Parameterized Constructor of ClassC");
    }
}

class Program
{
    static void Main(string[] args)
    {
        ClassC classc = new ClassC(1);
        Console.ReadLine();
    }
}

我收到编译时间错误:

'ClassA' does not contain a constructor that takes 0 arguments
'ClassB' does not contain a constructor that takes 0 arguments

但是当我将默认构造函数添加到两个 classes 时:

class ClassA
{
    public ClassA()
    {
        Console.WriteLine("Default Constructor of ClassA");
    }
    public ClassA(int a)
    {
        Console.WriteLine("Parameterized Constructor of ClassA");
    }
}
class ClassB : ClassA
{
    public ClassB()
    {
        Console.WriteLine("Default Constructor of ClassB");
    }
    public ClassB(int a)
    {
        Console.WriteLine("Parameterized Constructor of ClassB");
    }
}
class ClassC : ClassB
{
    public ClassC()
    {
        Console.WriteLine("Default Constructor of ClassC");
    }
    public ClassC(int a)
    {
        Console.WriteLine("Parameterized Constructor of ClassC");
    }
}

class Program
{
    static void Main(string[] args)
    {
        ClassC classc = new ClassC(1);
        Console.ReadLine();
    }
}

我得到了预期的输出。

Default Constructor of ClassA
Default Constructor of ClassB
Parameterized Constructor of ClassC

所以这意味着,在继承期间所有基 classes 需要一个无参数构造函数

我还没有得到任何明确的解释。请不要将其重复,如有任何好的解释,我们将不胜感激。

没有

class ClassB : ClassA
{
    public ClassB(int a)
    {
        Console.WriteLine("Parameterized Constructor of ClassB");
    }
}

相同
class ClassB : ClassA
{
    public ClassB(int a):base()
    {
        Console.WriteLine("Parameterized Constructor of ClassB");
    }
}

编译器默认尝试调用基 class 的无参数构造函数。如果基础 class 没有无参数构造函数,则必须自己显式调用它:

class ClassB : ClassA
{
    public ClassB(int a):base(a)
    {
        Console.WriteLine("Parameterized Constructor of ClassB");
    }
}

此外,这与调用构造函数的顺序无关。那发生在运行时。您遇到编译时问题。