1. 程式人生 > >c++中虛擬函式和純虛擬函式定義

c++中虛擬函式和純虛擬函式定義

      只有用virtual宣告類的成員函式,使之成為虛擬函式,不能將類外的普通函式宣告為虛擬函式。因為虛擬函式的作用是允許在派生類中對基類的虛擬函式重新定義。所以虛擬函式只能用於類的繼承層次結構中。

     一個成員函式被宣告為虛擬函式後,在同一類族中的類就不能再定義一個非virtual的但與該虛擬函式具有相同的引數(包括個數和型別)和函式返回值型別的同名函式。

       根據什麼考慮是否把一個成員函式宣告為虛擬函式?

       ①  看成員函式所在的類是否會作為基類

       ② 看成員函式在類的繼承後有無可能被更改功能,如果希望更改其功能的,一般應該將它宣告為虛擬函式。

       如果成員函式在類被繼承後功能不需修改,或派生類用不到該函式,則不要把它宣告為虛擬函式。不要僅僅考慮到作為基類而把類中的所有成員函式都宣告為虛擬函式。

      應考慮對成員函式的呼叫是通過物件名還是通過基類指標或引用去訪問,如果是通過基類指標或引用去訪問的,則應當宣告為虛擬函式。有時在定義虛擬函式時,並不定義其函式體,即純虛擬函式。它的作用只是定義了一個虛擬函式名,具體功能留給派生類去新增。

      說明:使用虛擬函式,系統要有一定的空間開銷。當一個類帶有虛擬函式時,編譯系統會為該類構造一個虛擬函式表(vtbl),它是一個指標陣列,存放每個虛擬函式的入口地址。系統在進行動態關聯的時間開銷很少,提高了多型性的效率。

一、虛解構函式

      解構函式的作用是在物件撤銷之前把類的物件從記憶體中撤銷。通常系統只會執行基類的解構函式,不執行派生類的解構函式

      只需要把基類的解構函式宣告為虛擬函式,即虛解構函式,這樣當撤銷基類物件的同時也撤銷派生類的物件,這個過程是動態關聯完成的。

      如果將基類的解構函式宣告為虛擬函式時,由該基類所派生的所有派生類的解構函式都自動成為虛擬函式,即使派生類的解構函式與基類的解構函式名字不相同。

       最好把基類的解構函式宣告為虛擬函式,這將使所有派生類的解構函式自動成為虛擬函式,如果程式中顯式delete運算子刪除一個物件,而操作物件用了指向派生類物件的基類指標,系統會呼叫相應類的解構函式。

     建構函式不能宣告為虛擬函式。

二、純虛擬函式

        有時候,基類中的虛擬函式是為了派生類中的使用而宣告定義的,其在基類中沒有任何意義。此類函式我們叫做純虛擬函式,不需要寫成空函式的形式,只需要宣告成:

      virtual 函式型別 函式名(形參表列)=0;

       注意:純虛擬函式沒有函式體;

      最後面的“=0“並不代表函式返回值為0,只是形式上的作用,告訴編譯系統”這是純虛擬函式”;

      這是一個宣告語句,最後應有分號。

     純虛擬函式只有函式的名字但不具備函式的功能,不能被呼叫。在派生類中對此函式提供定義後,才能具備函式的功能,可以被呼叫。