转自:http://www.cnblogs.com/smhy8187/articles/1686815.html
使用虚函数就是在父类中把子类*有的但却易于变化或者不清楚的特征抽取出来,作为子类需要去重新实现的操作(override),我们可以称之做“热点”。而虚拟函数也是OOP中实现多态的关键之一。
例子(C#):
class 飞禽 { public string wing; // 翅膀 public string feather; // 羽毛 …… // 其它属性和行为 public virtual bool Fly() // 利用关键字virtual来定义为虚拟函数,这是一个热点 { // 空下来让子类去实现 } } class 麻雀 : 飞禽 // 麻雀从飞禽继承而来 { …… // 定义麻雀自己特有的属性和行为 public override bool Fly() // 利用关键字override重载飞翔动作,实现自己的飞翔 { …… // 实现麻雀飞的动作 } } class 鹤 : 飞禽 // 鹤从飞禽继承而来 { …… // 定义鹤自己的特有的属性和行为 public override bool Fly() // 利用关键字override重载实现鹤的飞翔 { …… // 实现鹤飞的动作 } }
这样我们只需要在抽象模型“飞禽”里定义Fly()这个行为,表示所有由此“飞禽”派生出去的子类都会有Fly()这个行为,而至于Fly()到底具体是怎么实现的,那么就由具体的子类去实现就好了,不会再影响“飞禽”这个抽象模型了。
比如现在我们要做一个飞禽射击训练的系统,我们就可以这样来使用上面定义的类:
// 如何来使用虚拟函数,这里同时也是一个多态的例子. // 定义一个射击飞禽的方法 // 注意这里申明传入一个“飞禽”类作为参数,而不是某个具体的“鸟类”。好处就是以后不管再出现多少 // 种鸟类,只要是从飞禽继承下来的,都照打不误:)(多态的方式) void ShootBird(飞禽 bird) { // 当鸟在飞就开始射击 if(bird.Fly()) { …… // 射击动作 } } static void main() { / /打麻雀 ShootBird(new 麻雀()); // 打鹤 ShootBird(new 鹤()); // 都是打鸟的过程,我只要实现了具体某个鸟类(从“飞禽”派生而来)的定义,就可以对它 // 进行射击,而不用去修改ShootBird函数和飞禽基类 ShootBird(new 其它的飞禽()); }