首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么以下程序的输出是=> BC::Display::Display::Display

为什么以下程序的输出是=> BC::Display::Display::Display
EN

Stack Overflow用户
提问于 2015-05-20 09:27:55
回答 2查看 98关注 0票数 0
代码语言:javascript
复制
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();


   }
}

为什么输出不是"BC::Display::Display::Display“?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-20 09:32:22

如果在Visual中编译它,您将得到以下警告:

代码语言:javascript
复制
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

您必须在overrideTC中使用virtual而不是DC,否则您正在执行一个new virtual,并创建一个新方法,它不是“覆盖”BC.Display,而是简单地“隐藏”它。

这里有一个很好的解释:https://stackoverflow.com/a/6162547/613130关于virtual/overridenew之间的区别

票数 0
EN

Stack Overflow用户

发布于 2015-05-20 09:31:23

只需要将基类中的方法标记为virtual。派生类中的方法应该标记为override,否则它们会隐藏底层方法。因为它们是“不同的”方法,而且bBC类型的,所以编译器会将所有调用路由到BC.Display

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30345634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档