今天講講C++中,虛函數與純虛函數的用法和區別。
虛函數的提出在我上一篇關於C++的文章中已經提過(見http://www.linuxidc.com/Linux/2013-04/83407.htm),是為了解決多繼承的二義性而提出的,今天不再贅述;
而純虛函數是一種特殊的函數,它的作用是在基類中不給出有意義的實現,而把說明成純虛函數,它的實現留給該基類的派生類去做。包含純虛函數的類就是抽象類,抽象類不能被實例化,但是可以定義指向抽象類數據的指針變量,當派生類稱為具體類後,就可以用這種指針指向派生類的對象,然後通過該指針調用虛函數,實現多態操作。
虛函數和純虛函數的書寫格式類似於下面:
class Student
{
virtual char * test(); //虛函數
virtual char * Category() =0; //純虛函數
};
虛函數可以被直接調用,也可以備子類重載以後以多態的形式調用,而純虛函數必須在子類中實現該函數才可以使用,因為純虛函數在基類只有聲明而沒有定義。
虛函數和純虛函數的定義中不能有static 標識符,原因很簡單,被static修飾的函數在編譯時候要求前期綁定,然而虛函數確實動態綁定,而且被兩者修飾的函數生命周期也不一樣。
如果一個類中含有純虛函數,那麼任何試圖對該類進行實例化的語句都將導致錯誤的產生,因為抽象基類不能被直接調用,必須呗子類集成重載以後,根據要求調用其子類的方法。
class StudentA
{
public:
virtual void funOne() = 0; // 說明fun函數為純虛函數
virtual void funTwo();
};
class StudentB
{
public:
virtual void funOne();
virtual void funTwo();
};
// CA,CB類的實現
...
void main()
{
StudentA xiaoliu; // 不允許,因為類CA中有純虛函數
StudentB xiaoxin; // 可以,因為類CB中沒有純虛函數
...
}
本文簡要介紹了虛函數和純虛函數,並對它們做了簡要區分。簡單來說,虛函數是為了多重繼承的二義性問題而提出的解決方案,純虛函數的提出是使一些類的實例化更加符合邏輯,便於實現多態。