虛函數(shù)有時(shí)候也被稱為方法。它可以使有差異的實(shí)體對象公用一種方法實(shí)現(xiàn)不同的操作。
虛函數(shù)能克服類型域解決方案中的缺陷,它使程序員能夠在基類聲明一些能夠在各個(gè)派生類里面重新定義的函數(shù)。編譯器和裝載程序能保證對象和應(yīng)用于他們的函數(shù)之間的正確對應(yīng)關(guān)系。
class Employee
{
string name;
public:
Employee(const string &name);
virtual void print() const;
}
void Employee::print() const
{
cout<<name<endl;
}
關(guān)鍵字virtual指明print的作用就像是一個(gè)界面,既可以服務(wù)本類print函數(shù),又可以服務(wù)于派生類的print函數(shù)。對于派生類定義的print函數(shù),編譯器保證對于生成的每一個(gè)實(shí)體對象都能調(diào)用正確的print函數(shù)。
在派生類中對于有關(guān)函數(shù)的參數(shù)類型必須于虛函數(shù)的的參數(shù)類型相同,但可以在返回值類型上不同。
所謂的多態(tài)性就是從Employee中取得了正確的行為,而不依賴于實(shí)際使用的是哪一種Employee。一個(gè)帶有虛函數(shù)的類型被稱為是一個(gè)多態(tài)類型。在C++要取得多態(tài)行為,被調(diào)用的函數(shù)必須是虛函數(shù),而對象必須是通過指針或者引用操作。如果直接操作一個(gè)對象(而不是通過指針或者引用),它的確切類型已經(jīng)被編譯器所知,就不需要多態(tài)了。
為了實(shí)現(xiàn)多態(tài)性,編譯器必須在類的每個(gè)對象里存儲(chǔ)某種類型信息,并且在需要虛函數(shù)的時(shí)候利用這些信息。在典型的實(shí)例中,所需要的空間是一個(gè)指針。只有那些包含了虛函數(shù)的類才需要這點(diǎn)空間,而不是任何對象,甚至不是任何派生類的對象。使用時(shí),只需要為含有虛函數(shù)的類付出開銷。