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“?
发布于 2015-05-20 09:32:22
如果在Visual中编译它,您将得到以下警告:
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您必须在override和TC中使用virtual而不是DC,否则您正在执行一个new virtual,并创建一个新方法,它不是“覆盖”BC.Display,而是简单地“隐藏”它。
这里有一个很好的解释:https://stackoverflow.com/a/6162547/613130关于virtual/override和new之间的区别
发布于 2015-05-20 09:31:23
只需要将基类中的方法标记为virtual。派生类中的方法应该标记为override,否则它们会隐藏底层方法。因为它们是“不同的”方法,而且b是BC类型的,所以编译器会将所有调用路由到BC.Display。
https://stackoverflow.com/questions/30345634
复制相似问题