输出的结果为:2
二、虚方法和非虚方法
若一个实例方法的声明中含有virtual修饰符,则称该方法为虚方法。若其中没有virtual修饰符,则称该方法为非虚方法。
非虚方法的实现是一成不变的,无论该方法是在声明它的类的实例上调用还是在派生类的实例上调用,实现均相同。与此相反,虚方法的实现可以由派生类取代。取代所继承的虚方法的实现的过程称为重写该方法。在虚方法调用中,该调用所涉及的那个实例运行时类型确定了要被调用的究竟是该方法的哪一种实现。在非虚方法调用中,相关的实例的编译时类型是决定性因素。
例二、使用虚方法和非虚方法在派生类中调用
<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Text
{
public class A
{
public virtual void ab()//定义的类A的虚方法 </span>
[csharp] view plaincopyprint?
<span style="font-size:18px;"> {
Console.WriteLine("这是虚方法");
}
public void ac()//定义的类A的非虚方法
{
Console.WriteLine("这是非虚方法");
}
}
public class B:A//类B私有继承类A
{
public override void ab()//重写继承的ab方法
</span> <span style="font-size:18px;"> {
Console.WriteLine("这是新的方法");
}
public new void ac()//创建一个新的方法覆盖原来的ac方法
{
Console.WriteLine("这是另一个新的方法");
}
}
class Program
{
static void Main(string[] args)
{
B b = new B();//创建类B的对象b
A a = b;//将对象b赋值给类A的对象a
a.ab();//调用原ab虚方法
b.ab();//调用ab方法
a.ac();//调用原ac非虚方法
b.ac();//调用ac方法
Console.ReadLine();
}
}
}</span>
输出的结果为:

从输出的结果中可以看出虚方法的实现是由派生类取代并且由它的方法实现,而非虚方法的实现是定义的类和派生类的各自由它们的方法实现。
三、虚方法和重写方法










