c# - 需要了解以下 C# 虚方法代码

标签 c# .net inheritance virtual-functions

这是一段显示虚拟方法的小代码。

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;        

    a.F();
    b.F();        
 }
}

此代码打印以下输出:

B.F
B.F

我不明白为什么 a.F() 会打印 B.F ?

我认为它会打印 D.F,因为 B 类覆盖了 A 类的 F(),然后使用“new”关键字将此方法隐藏在 C 类中,然后它再次在 D 类中被覆盖。所以最后 D.F 保留下来.

但它并没有这样做。你能解释一下它为什么打印 B.F 吗?

最佳答案

A a = d;
a.F();

它将按如下方式找到F()

  1. A 类第一名
  2. 然后在 B 类
  3. 然后在 C 类
  4. 然后在D类

现在 F() 将在 AB 中找到。因此 B.F() 将被调用。在 class C 中,F() 是不同的(因为它是新的实现并且不会从 A/B 覆盖)。所以在第 3 步中,将找不到 c.F()。在D类中,它覆盖了C创建的新函数,因此也不会被发现。

由于 new 关键字,生成的代码如下(关于虚拟覆盖)

    class A
    {
        public virtual void F() { Console.WriteLine("A.F"); }
    }
    class B: A
    {
        public override void F() { Console.WriteLine("B.F"); }
    }
    class C: B
    {
        public virtual void F1() { Console.WriteLine("C.F"); }
    }
    class D: C
    {
        public override void F1() { Console.WriteLine("D.F"); }
    }

关于c# - 需要了解以下 C# 虚方法代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11356287/

相关文章:

c# - byte[] 和 MemoryStream 之间的转换会产生开销吗?

c# - PayPal 付款后如何获取 TransactionID

ruby - 测试一个 Ruby 类是否是另一个类的子类

c# - 共享对象和线程

c# - 在 CaSTLe ActiveRecord 中尝试通过主键查找

c# - 在 Visual Studio 中调试时如何强制出现异常?

java - 输出是什么?

inheritance - 在 child 的构造函数中初始化抽象类字段

c# - 在 configSource 中使用外部 .config 文件会产生错误

c# - 使用 ConfigurationManager 帮助访问应用程序设置