虛函數

   虛函數是重載的另一種表現形式。這是一種動態的重載方式,它提供了一種更爲靈活的、運行時的多態性機制。虛函數允許函數調用與函數體之間的聯繫在運行時才建立,也就是在運行時才決定如何動作,即所謂的動態連編。

   虛函數首先是基類中的成員函數,但這個成員函數前面加了關鍵字virtual,並在派生類中被重載。

    它的一般形式:

   virtual  返回類型   函數名(形參表)

{

    函數體

}

   在基類中的某個成員函數被聲明爲虛函數後,此虛函數就可以在一個或多個派生類中被重新定義。虛函數在派生類中重新定義時,其函數原型,包括返回類型、函數名、參數個數、參數類型的順序,都必須與基類中的原型完全相同。

  對於虛函數的定義有幾點說明:

1、由於虛函數使用的基礎是賦值兼容規則,而賦值兼容規則成立的前提條件是派生類從基類公有派生。

2、必須首先在基類中定義虛函數。由於“基類”與“派生類”是相對的,因此這項說明並不表明必須在類等級的最高層類中聲明虛函數。在實際應用中,應該在類等級內需要具有動態多態性的幾個層次中的最高層類內首先聲明虛函數。

3、在派生類中對基類中聲明的虛函數進行重新定義時,關鍵字virtual可以寫可以不寫。但在容易引起混亂的情況下,最好在派生類的虛函數進行重新定義時加上關鍵字virtual。

4、雖然使用對象名和點運算符的方式可以調用虛函數,若 

  定義 基類 Base對象 b 虛函數爲show() 

  b.show();可以調用虛函數Base::show();但是這種調用在編譯時進行的是靜態連編,沒有充分利用虛函數的特性,只有通過基類指針訪問虛函數是才能獲得運行時的多態性

5、一個虛函數無論被繼承多少次,它仍然保持虛函數的特性。

6、虛函數必須是其所在類的成員函數,不能是友元函數,也不能是靜態成員函數,因爲虛函數調用要靠特定的對象來決定該激活那個函數。

7、內聯函數不能爲虛函數,因爲內聯函數是不能在運行中動態確定其位置的。即使虛函數在類的內部定義,編譯時仍將其看作是非內聯的。

8、構造函數不能是虛函數,但是析構函數可以是虛函數,而且通常說明爲虛函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章