为什么下面程序的输出是 => BC::Display BC::Display BC::Display
Why the output of following program is => BC::Display BC::Display BC::Display
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 DC::Display TC::Display"?
只有基class中的方法需要标记virtual
。派生的 classes 中的方法应标记为 override
,否则它们会隐藏底层方法。由于它们是 "different" 方法,并且 b
属于 BC
类型,编译器会将所有调用路由到 BC.Display
.
如果您在 Visual Studio 中编译它,您将收到这些警告:
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
您必须在 DC
和 TC
中使用 override
而不是 virtual
,否则您正在执行 new virtual
并创建一个新方法't "overriding" BC.Display
但那只是 "hiding" 它。
这里有个很好的解释:关于virtual/override
和new
的区别
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 DC::Display TC::Display"?
只有基class中的方法需要标记virtual
。派生的 classes 中的方法应标记为 override
,否则它们会隐藏底层方法。由于它们是 "different" 方法,并且 b
属于 BC
类型,编译器会将所有调用路由到 BC.Display
.
如果您在 Visual Studio 中编译它,您将收到这些警告:
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
您必须在 DC
和 TC
中使用 override
而不是 virtual
,否则您正在执行 new virtual
并创建一个新方法't "overriding" BC.Display
但那只是 "hiding" 它。
这里有个很好的解释:关于virtual/override
和new