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

C#多态upcasting场景疑问:向上转型后调用方法为何输出派生类结果

问题原因解释

你观察到的运行结果是C#多态机制的正常表现,并非向上转型(upcasting)未生效。

核心原理说明

  • C#中virtual/override关键字组合是运行时多态的实现方式:基类标记为virtual的方法,子类用override重写后,方法调用会匹配实例的实际运行时类型,而非变量的声明类型。
  • 向上转型的作用仅为将子类实例的引用赋值给父类类型的变量,只会限制可访问的成员范围,不会改变实例本身的实际类型。

你的代码执行逻辑

  1. 执行B b = (B)new A()时,向上转型正常生效:你得到了一个声明类型为B的变量,但它指向的实例实际类型仍然是A。
  2. 调用b.Method()时,运行时会先检查实例的实际类型为A,且A已经重写了Method方法,因此最终执行A类中的方法实现,输出A。

如果需要向上转型后调用基类方法的实现

可以将子类的方法改为用new关键字隐藏基类方法,而非重写:

public class A : B
{
    // 用new隐藏基类方法,而非重写
    public new void Method()
    {
        Console.WriteLine("A");
    }
}

public class B
{
    public virtual void Method()
    {
        Console.WriteLine("B");
    }
}

此时执行B b = (B)new A(); b.Method();就会输出B,匹配你原本对向上转型的预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:36:03