註:
1. 一個成員函數被聲明為虛函數後,在同一類族中的類就不能再定義一個非virtual的但與該虛函數具有相同的參數(包括個數和類型)和函數傳回值類型的同名函數。
2. 根據什麼考慮是否把一個成員函式宣告為虛函數?
(1)成員函數所在的類是否會作為基類。
(2)成員函數在類的繼承後有無可能被更改功能,如果希望更改其功能的,一般應該將它聲明為虛函數。
如果成員函數在類被繼承後功能不需修改,或衍生類別用不到該函數,則不要把它聲明為虛函數。
不要僅僅考慮到作為基類而把類中的所有成員函數都聲明為虛函數。
(3)調用是通過對象名還是通過基類指標或引用去訪問,如果是通過基類指標或引用去訪問的,則應當聲明為虛函數。
說明:使用虛函數,系統要有一定的空間開銷。當一個類帶有虛函數時,編譯系統會為該類構造一個虛函數表,它是一個指標數組,存放每個虛函數的入口地址。系統在進行動態關聯的時間開銷很少,提高了多態性的效率。
3. 解構函式的作用是在對象撤銷之前把類的對象從記憶體中撤銷。通常系統只會執行基類的解構函式,不執行衍生類別的解構函式。
只需要把基類的解構函式聲明為虛函數,即虛解構函式,這樣就會撤銷基類對象的同時撤銷衍生類別的對象了,這個過程是動態關聯完成的。
4.如果將基類的解構函式聲明為虛函數時,由該基類所派生的所有衍生類別的解構函式都自動成為虛函數,即使衍生類別的解構函式與基類的解構函式名字不相同。
最好把基類的解構函式聲明為虛函數。這將使所有衍生類別的解構函式自動成為虛函數,如果程式中顯式delete運算子刪除一個對象,而操作對象用了指向衍生類別對象的基類指標,系統會調用相應類的解構函式。
5.建構函式不能聲明為虛函數。
6.純虛函數
有時候,基類中的虛函數是為了衍生類別中的使用而聲明定義的,其在基類中沒有任何意義。此類函數我們叫做純虛函數,不需要寫成空函數的形式,只需要聲明成:
virtual float area()const=0;
一般形式:virtual 函數類型 函數名(形參表列)=0;
注意:純虛函數沒有函數體;
最後面的“=0“並不代表函數傳回值為0,只是形式上的作用,告訴編譯系統”這是純虛函數”;
這是一個聲明語句,最後應有分號。
純虛函數只有函數的名字但不具備函數的功能,不能被調用。在衍生類別中對此函數提供定義後,才能具備函數的功能,可以被調用。