虛函數是c++實現多態的一種機制,基類的虛函數可以有子類的函數重新定義,從而實現函數功能的靈活性。
虛函數又分爲:普通虛函數和純虛函數。
純虛函數是一種特殊的虛函數,它的一般格式如下:
class <類名>
{
virtual <類型><函數名>(<參數表>)=0;
…
};
在許多情況下,在基類中不能對虛函數給出有意義有實現,而把它說明爲純虛函數,它的實現留給該基類的派生類去做。這就是純虛函數的作用。
抽象類
帶有純虛函數的類稱爲抽象類。抽象類是一種特殊的類,它是爲了抽象和設計的目的而建立的,它處於繼承層次結構的較上層。抽象類是不能定義對象的,在實際中爲了強調一個類是抽象類,可將該類的構造函數說明爲保護的訪問控制權限。
抽象類的主要作用是將有關的組織在一個繼承層次結構中,由它來爲它們提供一個公共的根,相關的子類是從這個根派生出來的。
抽象類刻畫了一組子類的操作接口的通用語義,這些語義也傳給子類。一般而言,抽象類只描述這組子類共同的操作接口,而完整的實現留給子類。
抽象類只能作爲基類來使用,其純虛函數的實現由派生類給出。如果派生類沒有重新定義純虛函數,而派生類只是繼承基類的純虛函數,則這個派生類仍然還是一個抽象類。如果派生類中給出了基類純虛函數的實現,則該派生類就不再是抽象類了,它是一個可以建立對象的具體類了。
在有些情況下不想把基類置爲抽象類,增加子類功能的靈活性,使用純虛函數就不夠方便了,可以使用普通虛函數而把方法體置空,格式如下:
class <類名>
{
virtual <類型><函數名>(<參數表>) { }
…
};
這樣子類就可以選擇性的重定義函數體,同時也保證了類本身不是抽象類,增加靈活性。