【问题标题】:What is Function Calling Sequence OF Virtual Function In C#?C#中虚函数的函数调用顺序是什么?
【发布时间】:2015-04-20 12:22:46
【问题描述】:

我有这个代码:

namespace ConsoleApplicationDemo
{
    class base 
    {
        public virtual void   Sum()
        {
            Console.WriteLine("Sum in base ");
        }
    }
    class Program:base 
    {

        public override void Sum()
        {

            Console.WriteLine("SUM  IN Program ");
        }

        static void Main(string[] args)
        {

            base A2 = new Program();
            A2.Sum();
            Program P2 = new Program();
            P2.Sum();
            Console.ReadLine();
        }
    }
}

得到OutPUT:SUM IN Program SUM IN Program

我的问题是为什么基类 Sum FunCtion 没有被这段代码调用?

base A2 = new Program();
A2.Sum();

【问题讨论】:

  • 因为多态性。你必须做 base A2 = new base() 才能得到你想要的结果。
  • 你不能有一个名为base的类。它是一个保留字。试试Base@base
  • 阅读link
  • 最好完全使用另一个词而不是base

标签: c# .net function overriding virtual


【解决方案1】:

标记为覆盖的方法会覆盖其基本方法的完整实现。因此,如果您创建派生类Program 的实例,则会调用此覆盖方法。但是,您也可以使用 base.Sum() 从派生方法中调用基本实现

public override void Sum()
{
    base.Sum();  // now you see why base is a really bad name for your class
    Console.WriteLine("SUM  IN Program ");
}

【讨论】:

    【解决方案2】:

    多态会改变子类的实现。即使将子类引用向上转换到其基类型,也无法访问基类virtual 方法实现,而是对象继承的最深实现。

    另一方面,派生类可以使用base关键字有效地访问基类实现:

    public override void Sum()
    {
         // This calls base implementation.
         base.Sum();
    
         Console.WriteLine("SUM  IN Program ");
    }
    

    无论如何,base 将调用直接基类的实现。您将无法在继承树中调用高于一级的实现。

    【讨论】:

      【解决方案3】:

      这是因为您已经覆盖了基类实现。 Virtual/Override 说“嘿,每次调用这个方法时都使用被覆盖的方法。”

      如果您使用 new 关键字标记了子类函数,它会按照您的描述进行操作。 (就个人而言,我不喜欢使用 new 关键字,因为大多数人不了解其实现的细微差别,但它执行您描述的行为。有更好的选择)。

      Article describing new keyword.

      【讨论】:

      • 我不喜欢你关于new 的建议,因为这是重用标识符而不是多态性......
      • 不要误会我的意思,我不是作为建议提供它,我只是指出他所描述的动作是新的。就个人而言,我不喜欢为此使用 new 关键字。
      • 如果这是我自己的答案,我会完全删除它,因为我在 SO 中看到了其他问答,很多人将 new 与多态性混淆,但这取决于你!
      猜你喜欢
      • 1970-01-01
      • 2020-04-08
      • 2010-10-13
      • 2020-10-19
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      • 2012-07-20
      相关资源
      最近更新 更多