今天講講C++中,虛函數與純虛函數的用法和區別。 虛函數的提出在我上一篇關於C++的文章中已經提過,是為了解決多繼承的二義性而提出的,今天不再贅述; 而純虛函數是一種特殊的函數,它的作用是在基類中不給出有意義的實現,而把說明成純虛函數,它的實現留給該基類的派生類去做。包含純虛函數的類就是抽象類,抽象類不能被實例化,但是可以定義指向抽象類數據的指針變量,當派生類稱為具體類後,就可以用這種指針指向派生類的對象,然後通過該指針調用虛函數,實現多態操作。 虛函數和純虛函數的書寫格式類似於下面: [cpp] class Student { virtual char * test(); //虛函數 virtual char * Category() =0; //純虛函數 }; class Student { virtual char * test(); //虛函數 virtual char * Category() =0; //純虛函數 }; 虛函數可以被直接調用,也可以備子類重載以後以多態的形式調用,而純虛函數必須在子類中實現該函數才可以使用,因為純虛函數在基類只有聲明而沒有定義。 虛函數和純虛函數的定義中不能有static 標識符,原因很簡單,被static修飾的函數在編譯時候要求前期綁定,然而虛函數確實動態綁定,而且被兩者修飾的函數生命周期也不一樣。 如果一個類中含有純虛函數,那麼任何試圖對該類進行實例化的語句都將導致錯誤的產生,因為抽象基類不能被直接調用,必須呗子類集成重載以後,根據要求調用其子類的方法。 [cpp] 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中沒有純虛函數 ... } 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中沒有純虛函數 ... }