C# C语言中虚函数的函数调用顺序是什么?

C# C语言中虚函数的函数调用顺序是什么?,c#,.net,function,overriding,virtual,C#,.net,Function,Overriding,Virtual,我有以下代码: namespace ConsoleApplicationDemo { class base { public virtual void Sum() { Console.WriteLine("Sum in base "); } } class Program:base { public override void Sum() {

我有以下代码:

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();
        }
    }
}
获取输出:程序中的和程序中的和

我的问题是为什么基类和函数没有被这段代码调用

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

这是因为您已经重写了基类实现/Override表示每次调用此方法时都使用Override方法

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


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


多态性更改子类的实现。即使将子类引用向上转换为其基类型,也无法访问基类虚拟方法实现,而是访问对象继承的最深层实现

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


无论如何,base将调用即时基类的实现。由于多态性,您将无法调用继承树中高于一级的实现。

。您必须执行base A2=new base才能得到您想要的结果。您不能有一个名为base的类。这是一个保留字。尝试Base或@baseRead更好地使用另一个词而不是Base我不喜欢你关于new的建议,因为这是重用标识符而不是多态性…别误会,我不是建议你使用它,我只是指出new就是他描述的动作。就我个人而言,我从来都不喜欢用new这个关键词。如果这是我自己的答案,我会完全删除它,因为我在这里看到过其他Q&a,很多人把new和多态性混淆了,但这取决于你!
public override void Sum()
{
    base.Sum();  // now you see why base is a really bad name for your class
    Console.WriteLine("SUM  IN Program ");
}
public override void Sum()
{
     // This calls base implementation.
     base.Sum();

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