C# 为什么以下程序的输出为=>;BC::Display BC::Display BC::Display

C# 为什么以下程序的输出为=>;BC::Display BC::Display BC::Display,c#,overriding,C#,Overriding,为什么输出不是“BC::Display DC::Display TC::Display”?只有基类中的方法需要标记为virtual。派生类中的方法应标记为重写,否则它们将隐藏底层方法。由于它们是“不同”的方法,并且b属于BC类型,编译器将把所有调用路由到BC。如果在Visual Studio中编译,则会显示,您将收到以下警告: class BC { public virtual void Display() { System.Console.WriteLine("

为什么输出不是“BC::Display DC::Display TC::Display”?

只有基类中的方法需要标记为
virtual
。派生类中的方法应标记为
重写
,否则它们将隐藏底层方法。由于它们是“不同”的方法,并且
b
属于
BC
类型,编译器将把所有调用路由到
BC。如果在Visual Studio中编译,则会显示

,您将收到以下警告:

class BC
{
    public virtual void Display()
    {
        System.Console.WriteLine("BC::Display");
    }
}

class DC : BC
{
    public virtual void Display()
    {

        System.Console.WriteLine("DC::Display");

    }
}

class TC : DC
{
    public virtual void Display()
    {
        System.Console.WriteLine("TC::Display");
    }
}



class Program
{
   public static void Main()
   {
       BC b;
       b = new BC();
       b.Display();

       b = new DC();
       b.Display();

       b = new TC();
       b.Display();


   }
}
您必须在
DC
TC
中使用
override
而不是
virtual
,否则您正在执行
新虚拟
并创建一个新方法,该方法不会“覆盖”BC。显示
,但这只是“隐藏”它


这里有一个很好的解释:关于
virtual/override
new

之间的区别,请检查:编译器警告给出了发生这种情况的原因的提示。您正在隐藏继承的成员。
Warning 2   'Workbench.Program.DC.Display()' hides inherited member 'Workbench.Program.BC.Display()'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword. C:\Users\Alberti\Documents\Visual Studio 2013\Projects\Workbench\Workbench\Program.cs   328 29  Workbench
Warning 3   'Workbench.Program.TC.Display()' hides inherited member 'Workbench.Program.DC.Display()'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword. C:\Users\Alberti\Documents\Visual Studio 2013\Projects\Workbench\Workbench\Program.cs   338 29  Workbench