You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#派生类重写同名方法未用virtual和override仍生效的原因问询

问题解答

你遗漏的是C#中方法隐藏(方法阴影)和方法重写的差异,以及多态调用的触发条件,具体说明如下:

  • 你当前代码的实际行为:没有加virtual/override时,派生类的textmethod属于对基类同名方法的隐藏,此时编译器默认会生成警告,提示你如果是有意隐藏请添加new关键字显式声明。
  • 你当前的测试场景没有触发两者的差异:你直接用Class2类型的变量调用方法,不管是隐藏还是重写,都会优先调用和变量类型匹配的实现,所以运行结果看起来完全一致。
  • 两者的核心差异体现在多态调用场景,你可以替换成以下测试代码验证区别:
public static void Main(string[] args)
{
    // 基类类型变量指向派生类实例,这是多态的典型使用场景
    Class1 obj = new Class2();
    obj.textmethod();
    Console.ReadKey();
}
  • 无virtual/override(方法隐藏)的运行结果:输出hello,调用基类实现
  • 基类加virtual、派生类加override(方法重写)的运行结果:输出hello there,调用派生类重写实现
  • 本质差异:方法隐藏相当于派生类定义了一个和基类完全无关的同名方法,只有用派生类本身的类型变量调用才会走派生类实现;而重写是修改了方法的继承链实现,只要是指向派生类实例,不管用基类还是派生类类型的变量调用,都会走派生类的重写实现。

内容的提问来源于stack exchange,提问作者Magicco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 21:06:09