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