c# - 这个代码块的输出对我来说没有意义

标签 c# virtual-functions

所有调用实例的运行时类型都是 D,因此,所有 F() 的调用都应该是在 D 中声明的 F() 方法。

using System;
class A
{
   public virtual void F() { Console.WriteLine("A.F"); }
}
class B: A
{
   public override void F() { Console.WriteLine("B.F"); }
}
class C: B
{
   new public virtual void F() { Console.WriteLine("C.F"); }
}
class D: C
{
   public override void F() { Console.WriteLine("D.F"); }
}
class Test
{
   static void Main() {
      D d = new D();
      A a = d;
      B b = d;
      C c = d;
      a.F();
      b.F();
      c.F();
      d.F();
   }
}

输出是:
B.F
B.F
D.F
D.F

输出不应该是:
D.F
D.F
D.F
D.F

最佳答案

Versioning with the Override and New Keywords (C# Programming Guide)

If the method in the derived class is preceded with the new keyword, the method is defined as being independent of the method in the base class.



所以你是 F来自 A 的方法和 BC 中的这些无关和 D ,这就是为什么你得到你得到的。

在运行时 CLR 查找 virtual应该从类型开始使用的方法实现,变量被声明为真正的类型。对于 a.F()b.F()它停在 B.F()声明,因为 C.F()是一种不同的方法(因为 new )。

关于c# - 这个代码块的输出对我来说没有意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15872454/

相关文章:

c++ - 强制从子类覆盖父类的所有虚函数

c++ - 委派给姊妹类

c# - 使用 Json 将带有两个对象的 View 模型传递给 Controller

c# - 附加限制 > 10

c++ - 覆盖虚函数和隐藏非虚函数有什么区别?

c++ - 为什么我们需要 C++ 中的虚函数?

c++ - 什么时候不调用被覆盖的虚函数

c# - 为winform应用程序绘制图标的工具是什么?

c# - 应用程序设置可靠吗?

c# - 具有进程内托管的 Dotnet Core 多个启动类