【问题标题】:Constructor and inheritance构造函数和继承
【发布时间】:2014-11-22 14:08:03
【问题描述】:

我到处读到:

构造函数不会从基类继承到派生类

如果这是真的,那么

在创建派生类对象时,如何调用基类默认构造函数?

例如:

public class A
{
    public void AA()
    {
        //anything
    }
}

public class B : A
{
    public void BB()
    {
        //anything
    }
}

class Program
{  
    static void Main(string[] args)
    {

        B Bobject = new B(); // Why it will call class A's default constructor if constructors not inherit from base to derived class
    }
}

【问题讨论】:

  • 它们不是被继承的,但是仍然可以(并且应该)从子类构造函数中调用它们来初始化父类。
  • 调用默认构造函数来构造基础。如果不想在派生类中使用默认构造函数,可以使用:base(parameter) 语法强制调用不同的构造函数。

标签: c#


【解决方案1】:

为什么:

在您的示例B IS-A A 中,它是A 的扩展。鉴于此,要构造B,必须在B 之前构造A 位,否则B 将无法访问A 提供的功能。

如何由Sergey Mozhaykin的回答提供。

您可以通过向A 添加非默认构造函数来证明这一点(从而删除默认的无参数构造函数),代码将无法编译,因为B 不再知道如何构造A。

【讨论】:

    【解决方案2】:

    基类的默认无参数构造函数将始终被隐式调用。如果您的基类没有无参数构造函数,那么您的派生类必须调用该构造函数并提供必要的参数。

    见Will the base class constructor be automatically called?

    所以要回答您的问题,不,基类的构造函数不是继承的,而是会以一种或另一种方式调用,无论是由您的派生类构造函数还是在您使用 new 关键字时隐式调用.

    【讨论】:

      【解决方案3】:

      您可以查看 C# 编译器生成的 IL。这是为 B 构造函数生成的:

      B..ctor:
      IL_0000:  ldarg.0     
      IL_0001:  call        A..ctor
      IL_0006:  nop         
      IL_0007:  nop         
      IL_0008:  nop         
      IL_0009:  ret  
      

      【讨论】:

      • 你的回答很好,但他想要这个的原因,而不是这个的核心
      猜你喜欢
      • 2016-03-24
      • 2011-12-27
      • 2017-11-17
      • 2020-08-07
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多