C# 关于C#中派生类调用基类构造函数的理解

1、 当基类中没有自己编写构造函数时,派生类默认的调用基类的默认构造函数
在这里插入图片描述
在这里插入图片描述
2、 当基类中编写构造函数时,派生类没有指定调用构造哪个构造函数时,会寻找无参的构造函数,如果没有则报错,另外无论调用派生类中的哪个构造函数都是寻找无参的那个基类构造函数,而非参数匹配。

在这里插入图片描述
3、 基类中编写了构造函数,则派生类中可以指定调用基类的某个构造函数,使用base关键字。

在这里插入图片描述
在这里插入图片描述

派生类构造函数执行顺序

针对派生类,创建对象的基类部分过程中会隐式调用基类的某一个构造函数作为创建实例过程的一部分,在继承层次链中的每个类在创建对象过程中,执行自己的构造函数体之前都要执行它的基类构造函数。

也就是说,如果派生类的基类也是派生类,则每个派生类只需负责其直接基类的构造,不负责简介基类的构造,并且实例构造函数的顺序是从最上面的基类开始下溯的,静态构造函数是从下面的类开始上溯的(下面代码解释了这个问题)。

注意,在构造函数中要避免调用虚函数方法。在执行基类构造函数是,在执行派生类的构造函数方法体,基类的虚方法会调用派生类的覆写方法,因此调用会在派生类没有完全初始化之前传递到派生类。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
二、构造函数初始化语句
一般情况下在实例化派生类对象的时候都会调用基类的无参数构造函数,但是构造函数是可以重载的,所以基类可能有多个构造函数。我们在显示的创建有参数构造函数的时候,这样系统就不会自动创建默认无参数构造函数,所以我们在创建有参数构造函数的时候,要同时再显示创建一个无参数的和默认形式相同的构造函数,这样设计才是优雅的设计。

当声明一个不带构造函数初始化语句的构造函数时,其实是省略了base()构造函数初始化语句,如下两个形式是等价的:

/* 等价的构造函数初始化语句 */

  class DrivedClass : BaseClass
 {
DrivedClass()                //隐式使用基类构造函数BaseClass()的构造函数
{
    ...
}
 }

  class DrivedClass : BaseClass
{
DrivedClass() : base()      //显示使用基类构造函数BaseClass()的构造函数
{
    ...
}
}

如果想要派生类使用指定的基类构造函数然不是默认的无参数构造函数,可以使用“构造函数初始化语句”来进行指定。可以从以下两个形式:

  1. 使用关键字base并指明使用哪一个基类构造函数

  2. 作用:使用base()指明使用基类的哪一个构造函数;

  3. 用法:使用有关键字base的构造函数初始化语句和要调用的基类构造函数参数列表

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_33950757/article/details/88842808