什么是C#中虚函数的函数调用序列?

时间:2015-04-20 12:22:47

标签: c# .net function override virtual

我有这段代码:

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程序SUM IN程序

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

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

3 个答案:

答案 0 :(得分:0)

这是因为你已经覆盖了基类的实现。 Virtual / Override说“嘿,每次调用此方法都会使用重写方法。”

如果您使用 new 关键字标记了子类功能,则会执行您所描述的操作。 (就个人而言,我不喜欢使用 new 关键字,因为大多数人都不了解其实现的细微差别,但它会执行您描述的行为。还有更好的替代方案。

Article describing new keyword.

答案 1 :(得分:0)

标记为覆盖的方法会覆盖其基本方法的完整实现。因此,如果您创建派生类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 :(得分:0)

多态性会改变子类的实现。即使您向其基类型转发子类引用,您也无法访问基类virtual方法实现,但是对象继承的最深层实现。

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

public override void Sum()
{
     // This calls base implementation.
     base.Sum();

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

无论如何,base会调用直接基类'实现。您无法在继承树中调用一个级别以上的实现。