news 2026/10/27 1:00:44

C# 继承与构造函数执行顺序详解:从一段代码看懂父类与子类的调用规则

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C# 继承与构造函数执行顺序详解:从一段代码看懂父类与子类的调用规则

一、先看一段示例代码

下面这段 C# 代码定义了一个父类ParentClass和一个继承自它的子类ChildClass,并在Main方法中创建子类对象、调用同名方法。建议先自己猜一下输出顺序,再往下看分析。

using System; public class ParentClass { public ParentClass() { Console.WriteLine("父类构造函数。"); } public void print() { Console.WriteLine("I'm a Parent Class。"); } } public class ChildClass : ParentClass { public ChildClass() { Console.WriteLine("子类构造函数。"); } public void print(string x) { Console.WriteLine(x); } public static void Main() { ChildClass child = new ChildClass(); child.print(); child.print("打印子类"); } }

二、运行结果

编译并运行上面的代码,控制台输出如下:

父类构造函数。 子类构造函数。 I'm a Parent Class。 打印子类

可以看到,创建ChildClass对象时,父类的构造函数先于子类的构造函数执行;而child.print()调用的是从父类继承来的无参print方法,child.print("打印子类")调用的则是子类自己定义的重载版本。

三、继承和执行是两码事

首先要说的是,继承和执行是两码事。

  • 继承:指子类是否具有和父类一样的类成员,而不用重新定义或实现一遍。继承的目的就是重用。
  • 执行:指在类的内部或外部使用这些成员的过程。

换句话说,继承描述的是“类与类之间的成员归属关系”,执行描述的是“运行时成员如何被调用”。二者经常同时出现,但概念上并不等价。

四、构造函数为什么先执行父类

执行构造函数,是指在使用某个类时,需要创建该类的对象并为这个对象的所有成员分配内存的过程。如果该类继承了某个父类,那么首先就要为父类的成员分配内存,自然就会先执行父类的构造函数。

因此,在 C# 中,子类继承父类后,调用子类的非静态构造函数时会默认先调用基类的无参构造函数,这是一条语言规则,而不是“函数继承”。函数本身是无法被继承的,继承只作用于类这一层级。

补充:如果父类没有无参构造函数,子类构造函数必须通过: base(...)显式指定要调用的父类构造函数,否则编译不通过。

五、关于“重写成员的内存覆盖”

当子类构造时,如果碰到被override重写的成员,那么这个曾经在父类构造时被分配的内存地址,会在子类构造时被新的地址覆盖掉。这也是为什么在父类构造函数中调用虚方法时,实际执行的可能已经是子类的实现——这一点在实际开发中需要特别小心。

六、小结

  1. 继承解决的是成员复用问题,执行解决的是成员调用问题,两者不要混为一谈。
  2. 创建子类对象时,父类构造函数先执行,子类构造函数后执行。
  3. 子类默认调用父类无参构造函数;父类没有无参构造函数时,必须用: base(...)显式指定。
  4. 方法重载(print()与print(string))与继承是两回事,调用哪个版本由参数列表决定。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/27 1:00:43

C# 参数传递详解:值传递与引用传递

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/27 0:48:13

别被“首飞成功”带偏:拆解飞行汽车eVTOL的工程化真相

1. "首飞成功"这四个字,含金量能差出十年几年前我第一次被这类消息"骗"到,是在一个行业群里。有人丢进来一段视频,几十秒,一架造型科幻的机器垂直升起、悬停、平稳落下,配文是"飞行汽车首飞成…

作者头像 李华
网站建设 2026/10/27 0:36:46

深度学习基础:MLP架构与非线性激活函数解析

1. 深度学习的非线性魔法:从感知机到多层神经网络2006年,Geoffrey Hinton在《Science》上发表的那篇开创性论文,正式开启了深度学习的新纪元。而这一切的基础,都源于一个看似简单的结构——多层感知机(MLP)…

作者头像 李华
网站建设 2026/10/27 0:26:01

营销技能不是招数,而是能力网络:四项核心模块实战拆解

真正能把"marketing skills"讲清楚的人,市面上其实不多。大多数时候,大家聊的是"会写文案""会投广告""会剪视频"这类单点技能,好像凑齐了这些,就等于会做营销了。我在这个行业摸爬了十多…

作者头像 李华
网站建设 2026/10/26 23:59:53

基于人脸关键点的疲劳监测:EAR、PERCLOS与工程避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/26 23:59:51

FOC矢量控制实战真经:从焊板到丝滑启动的工程心法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华