C# 继承和默认构造函数

标签 c# oop constructor

假设有一个基类A 和一个从A 派生的类B。 然后,我们知道 A 类的构造函数永远不会被 B 类继承。但是,当 B 的新对象被创建时,类 A 的默认构造函数在类 B< 的默认/自定义构造函数之前被调用 被调用。也许这样做的目的是类A的字段需要初始化为默认值。

现在,假设类 A 定义了一个自定义构造函数。这意味着 A 类的默认构造函数被编译器静默删除。现在,在创建类 B 的新实例时,在调用类 B 的构造函数之前会自动调用类 A 的哪个构造函数? (在这种情况下,类 A 字段如何初始化?)

最佳答案

Now, on creating a new instance of class B, which constructor of class A is automatically called before invoking the class B constructor?

基本上,代码将无法编译。每个构造函数都必须隐式或显式地链接到另一个构造函数。它链接到的构造函数可以在同一个类中(使用 this)或基类(使用 base)。

像这样的构造函数:

public B() {}

是隐含的:

public B() : base() {}

... 如果您根本没有指定构造函数,它将以相同的方式隐式添加 - 但它仍然必须有一些东西可以调用。例如,您的场景:

public class A
{
    public A(int x) {}
}

public class B : A {}

导致编译器错误:

error CS7036: There is no argument given that corresponds to the required formal parameter 'x' of 'A.A(int)'

但是,您可以显式指定不同的构造函数调用,例如

public B() : base(10) {} // Chain to base class constructor

public B() : this(10) {} // Chain to same class constructor, assuming one exists

关于C# 继承和默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29959839/

相关文章:

c# - 模拟并发 WCF 客户端调用并测量响应时间

c# - 我需要 MemoryBarrier 和 ReaderWriterLockSlim 吗?

c# - 获取给定扩展的图标

c# - 使用 MVVM 在 WPF DataGrid 中自定义排序

ios - Swift - 就地更新对象

C++ 链表 - 使用哨兵从文件中读取数据

objective-c - 子类可以覆盖非公共(public)方法吗

c++ - 为什么有些情况下可以省略模板参数规范?

c++ - "No default constructor"为类类型

c# - Visual Studio 无法识别我的构造函数?