虚拟方法

例如,如果我有一个名为"Parent"的类。 他有一个名为"Print".的方法"Print". 派生类"Kid" ,它有一个名为"Print"的方法,但是一个新方法。

 new public void Print; 

让我们创建一个对象:

 Parent p = new Kid(); 

如果我将使用方法Print使用此对象的指针,方法将是父亲的(“父”)方法,而不是“孩子”。

但是当我使用虚拟方法时,该方法将是Kid’s而不是父方法。(如果Print是虚拟的,则“Kid”中的print会覆盖方法“)

为什么?

您没有覆盖inheritance类中的方法 – 您正在隐藏它。

代替:

 public new void Print(); 

使用:

 public override void Print(); 

当您将new关键字与具有与父方法中的方法相同的签名的方法一起使用时,它会隐藏父方法。 阴影与重写不同。 阴影意味着如果实例和变量都是子类型,则将调用新方法。 而重写确保无论变量属于子类型还是父类,都将调用overriden方法。

编辑:

看一下MSDN上的比较表 。

我不太确定你在问什么,但这篇文章很好地介绍了C#中的多态性。

虚方法调用使用对象的实际类型来确定要调用的方法,而非虚方法使用引用的类型。

说你有:

 public class Parent { public void NonVirtualPrint() {} public virtual void VirtualPrint() {} } public class Kid : Parent { public new void NonVirtualPrint() {} override public void VirtualPrint() {} } 

然后:

 Parent p = new Parent(); Parent x = new Kid(); Kid k = new Kid(); p.NonVirtualPrint(); // calls the method in Parent p.VirtualPrint(); // calls the method in Parent x.NonVirtualPrint(); // calls the method in Parent x.VirtualPrint(); // calls the method in Kid k.NonVirtualPrint(); // calls the method in Kid k.VirtualPrint(); // calls the method in Kid