C#多态upcasting场景疑问:向上转型后调用方法为何输出派生类结果
问题原因解释
你观察到的运行结果是C#多态机制的正常表现,并非向上转型(upcasting)未生效。
核心原理说明
- C#中
virtual/override关键字组合是运行时多态的实现方式:基类标记为virtual的方法,子类用override重写后,方法调用会匹配实例的实际运行时类型,而非变量的声明类型。 - 向上转型的作用仅为将子类实例的引用赋值给父类类型的变量,只会限制可访问的成员范围,不会改变实例本身的实际类型。
你的代码执行逻辑
- 执行
B b = (B)new A()时,向上转型正常生效:你得到了一个声明类型为B的变量,但它指向的实例实际类型仍然是A。 - 调用
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
相关产品推荐
相关产品推荐

