先让我们回顾一下普通的方法重载。普通的方法重载指的是:类中两个以上的方法(包括隐藏的继承而来的方法),取的名字相同,只要使用的参数类型或者参数个数不同,编译器便知道在何种情况下应该调用哪个方法。
而对基类虚方法的重载是函数重载的另一种特殊形式。在派生类中重新定义此虚函数时,要求的是方法名称、返回值类型、参数表中的参数个数、类型、顺序都必须与基类中的虚函数完全一致。在派生类中声明对虚方法的重载,要求在声明中加上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某一时刻的指代类型来确定的,所以还体现了动态的多态性。
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索实例
, float
, 方法
, public
, 多态性
, speak gain setting
, 成员
返回先后
派生类重载基类函数、派生类 函数重载、基类调用派生类虚函数、派生类 虚析构函数、虚函数重载,以便于您获取更多的相关知识。