在派生类中对虚方法进行重载2007-09-28 本站 先让我们回顾一下普通的方法重载。普通的方法重载指的是:类中两个以上的方法(包括隐藏的继承而来的方法),取的名字相同,只要使用的参数类型或者参数个数不同,编译器便知道在何种情况下应该调用哪个方法。而对基类虚方法的重载是函数重载的另一种特殊形式。在派生类中重新定义此虚函数时,要求的是方法名称、返回值类型、参数表中的参数个数、类型、顺序都必须与基类中的虚函数完全一致。在派生类中声明对虚方法的重载,要求在声明中加上override关键字,而且不能有new,static或virtual修饰符。还是让我们用汽车类的例子来说明多态性的实现。程序清单14-4:
using System;class Vehicle //定义汽车类{public int wheels; //公有成员:轮子个数protected float weight; //保护成员:重量public Vehicle(int w,float g){ wheels=w; weight=g;}public virtual void Speak(){ Console.WriteLine("the w vehicle is speaking!");}};class Car:Vehicle //定义轿车类{int passengers; //私有成员:乘客数public Car(int w,float g,int p):base(w,g) { wheels=w; weight=g; passengers=p;} public override void Speak(){Console.WriteLine("The car is speaking:Di-di!"); }}class Truck:Vehicle //定义卡车类{int passengers; //私有成员:乘客数float load; //私有成员:载重量public Truck(int w,float g,int p,float l):base(w,g){ wheels=w; weight=g; passengers=p; load=l;}public override void Speak(){ Console.WriteLine("The truck is speaking:Ba-ba!");}}class Test{public static void Main(){Vehicle v1=new Vehicle();Car c1=new Car(4,2,5);Truck t1=new Truck(6,5,3,10);v1.Speak();v1=c1;v1.Speak();c1.Speak();v1=t1;v1.Speak(); t1.Speak();}}
分析上面的例子,我们可以看到:●Vehicle类中的Speak方法被声明为虚方法,那么在派生类中就可以重新定义此方法。●在派生类Car和Truck中分别重载了Speak方法,派生类中的方法原型和基类中的方法原型必须完全一致。●在Test类中,创建了Vehicle类的实例v1,并且先后指向Car类的实例c1和Truck类的实例t1。运行该程序,结果应该是:The Vehicle is speaking!
The car is speaking:Di-di!
The Car is speaking:Di-di!
The truck is speaking:Ba-ba!
The truck is speaking:Ba-ba!这里,Vehicle类的实例v1先后被赋予Car类的实例c1,以及Truck类的实例t1的值。在执行过程中,v1先后指代不同的类的实例,从而调用不同的版本。这里v1的Speak方法实现了多态性,并且v1.Speak()究竟执行哪个版本,不是在程序编译时确定的,而是在程序的动态运行时,根据v1某一时刻的指代类型来确定的,所以还体现了动态的多态性。