虛函數
定義:在某基類中聲明為 virtual, 並在一個或多個派生類中被重新定義的成員函數
子類繼承了父類的一個函數(方法),而我們把父類的指針指向子類,則必須把父類的該函數(方法)設為virtual(虛函數)
語法:virtual 函數返回類型 函數名(參數表) { 函數體 }
用途:實現多態性,通過指向派生類的基類指針,訪問派生類中同名覆蓋成員函數
虛函數必須是基類的非靜態成員函數,其訪問權限可以是protected或public,在基類的類定義中定義虛函數的一般形式
在定義了虛函數后,派生類繼承虛函數的接口,由於虛函數還提供了實現,派生類可以選擇改寫(override)它們或不改寫它們。
但基類與派生類的參數個數與類型要一致。如果在派生類中沒有對虛函數重新定義,則它繼承其基類的虛函數。
純虛函數
定義: 如果父類的函數(方法)根本沒有必要或者無法實現,完全要依賴子類去實現的話,可以把此函數(方法)設為 virtual 函數名=0 我們把這樣的函數(方法)稱為純虛函數。
特征: 純虛函數必須在繼承類中重新聲明函數(不要后面的=0,否則該派生類也不能實例化),而且它們在抽象類中往往沒有定義。
目的: 定義純虛函數的目的在於,使派生類僅僅只是繼承函數的接口。
非虛函數
當一個成員函數為非虛函數時,不管它的派生類有多特殊, 非虛函數的行為都是不變的.
聲明非虛函數的目的在於,使派生類繼承函數的接口和強制性實現。(所有的派生類都應該使用該非虛函數完成某一個功能)
抽象類
* 如果一個類包含了純虛函數,稱此類為抽象類
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
public class Animal
{
public virtual void Eat()
{
Console.WriteLine("I eat like a generic Animal.");
}
}
public class Wolf : Animal
{
public override void Eat()
{
Console.WriteLine("I eat like a wolf!");
}
}
public class Fish : Animal
{
public override void Eat()
{
Console.WriteLine("I eat like a fish!");
}
}
public class GoldFish : Fish
{
public override void Eat()
{
Console.WriteLine("I eat like a goldfish!");
}
}
public class OtherAnimal : Animal
{
// Eat() method is not overridden, so the base class method will be used.
}
public class Program
{
public static void Main(string[] args)
{
IList<Animal> animals = new List<Animal>();
animals.Add(new Animal());
animals.Add(new Wolf());
animals.Add(new Fish());
animals.Add(new GoldFish());
animals.Add(new OtherAnimal());
foreach (Animal currentAnimal in animals)
{
currentAnimal.Eat();
}
}
}
}
