没有调用基类构造函数的C#中的继承问题

时间:2018-10-26 12:11:48

标签: c# inheritance constructor

我想知道为什么我的以下代码没有出现错误。我没有在基类中定义任何构造函数,但在派生类中定义了一个构造函数。代码仍然按预期运行。有人可以帮我摆脱混乱。

class Shape
{
    public void Area()
    {
        Console.WriteLine("I am  a shape");
    }
}

class Circle : Shape
{
    double radius;
    const double pi = 3.14;

    public Circle(double rad)
    {
        radius = rad;
    }

    public new double Area()
    {
        return pi * radius * radius;
    }
}

代码可以完美编译,并为我提供理想的结果。 谢谢

class Progam
{
    static void Main(string[] args)
    {
        Shape s1 = new Shape();
        s1.Area();

        Shape s2 = new Circle(10);
        s2.Area();

        Circle c1 = new Circle(4.0);
        Console.WriteLine(c1.Area());
    }
}

3 个答案:

答案 0 :(得分:6)

如果未定义其他基本构造函数,则会自动执行默认的基本构造函数(即不带参数)。

当您未明确定义构造函数(如您的问题)时,会隐式定义默认构造函数

答案 1 :(得分:1)

默认构造函数 如果您没有为类提供构造函数,则C#默认创建一个实例化该对象的构造函数,并将成员变量设置为默认值表中列出的默认值。如果不为您的结构提供构造函数,则C#依赖于隐式默认构造函数将值类型的每个字段自动初始化为默认值表中列出的默认值。

参考:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/constructors

答案 2 :(得分:1)

正如其他人所指出的,在这里:

Shape s1 = new Shape();

您正在初始化Shape类。您认为这没有任何意义,因为您没有定义构造函数,但是由于您没有定义它,因此它是动态生成的,因此程序不会中断。 因此,您的Shaple类是这样执行的:

class Shape
{
    public Shape()
    {
    }

    public void Area()
    {
        Console.WriteLine("I am  a shape");
    }
}