C#面试题更新 2026-08-05

在 C# 中,虚方法(virtual method)和抽象方法(abstract method)在定义方式、实现要求以及类的继承关系上分别有哪些核心不同?请结合它们的语法特征和适用场景进行比较。

技术原理C#

考察说明

考察对 C# 面向对象中虚方法与抽象方法核心差异的理解。

回答思路

  1. 【回答框架 1】虚方法使用 virtual 关键字声明,必须有方法体,可以在基类中提供默认实现,派生类可以重写(override)也可以不重写,直接继承基类实现。抽象方法使用 abstract 关键字声明,没有方法体,只定义方法签名,派生类必须重写(override)才能实例化。
  2. 【回答框架 2】虚方法所在类可以是普通类,也可以被实例化;抽象方法所在类必须是抽象类(abstract class),抽象类不能被实例化,只能作为基类。抽象方法实际上是一种强制性的契约,而虚方法提供的是可选的扩展点。
  3. 【回答框架 3】从设计意图看,虚方法用于定义具有默认行为且允许子类选择性修改的方法;抽象方法用于定义子类必须实现的公共行为,强制子类遵循统一的接口规范。
  4. 【回答框架 4】重写时,虚方法和抽象方法都使用 override 关键字,但派生类中的 override 对于虚方法可选,对于抽象方法则必须提供实现。此外,抽象方法只能在抽象类中声明,而虚方法可以在任何类中声明。
  5. 【回答框架 5】实际使用时,如果基类有一个合理的默认实现且允许子类增强,应选择虚方法;如果基类无法提供通用实现,需要每个具体子类自行完成,则应选择抽象方法。
  6. 【关键点 1】虚方法必须有方法体,可重写也可不重写;抽象方法没有方法体,必须由派生类重写。
  7. 【关键点 2】抽象方法只能在抽象类中定义,抽象类不能实例化;虚方法无此限制。
  8. 【关键点 3】虚方法提供可选覆盖点,抽象方法作为强制实现契约。
  9. 【易错点 1】混淆抽象类与普通类的实例化限制,抽象类不能直接 new。
  10. 【易错点 2】认为抽象方法所在类可以是普通类,实际上必须是抽象类。
  11. 【易错点 3】忽略抽象方法在派生类中必须使用 override 关键词实现,否则编译错误。