程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++學習摘要之四:虛函數和多態

C++學習摘要之四:虛函數和多態

編輯:關於C++

多態性與前面提到的數據封裝和繼承性共同構成了面向對象程序設計的三個重要機制。

1.靜態聯編與動態聯編

由於函數重載的存在,當程序中出現調用同名函數時,編譯器會根據函數的參數類型、個數決定調用 執行哪一個同名函數的代碼,這種把一個函數的調用與適當的函數實現代碼聯系在一起的過程,叫做聯編 。根據聯編的實現階段的不同,可將其分為靜態聯編和動態聯編兩種。

靜態聯編是在程序編譯階段確定一個函數調用與函數實現代碼間的對應關系,這種對應關系確定下來 後,在程序運行過程中就根據這個對應關系去調用執行相應的函數代碼,並且這種對應關系在程序運行過 程中始終保持不變。

而動態聯編是在編譯階段不能決定執行哪個同名的被調函數,只在程序運行過程中根據需要處理的對 象類型來決定執行哪個類的成員函數。

2.多態性

所謂多態性就是指同樣的消息被類的不同對象接收時導致的完全不同的行為的一種現象。這裡所說的 消息即對類的成員函數的調用。

函數的重載可以實現多態性,但這裡要講的多態性是通過虛函數來實現的,而虛函數又必須存在於繼 承的環境下。

C++語言支持兩種類型的多態:一種是編譯時的多態(靜態多態),另一種是運行時的多態(動態多態 )。在編譯時的多態是通過靜態聯編實現的,而在運行時的多態則是通過動態聯編實現的。

3.虛函數

聲明虛函數的方法是在基類中的成員函數原型前加上關鍵字virtual。格式如下:

class 類名{

……

virtual 類型 函數名(參數表);

……

};

當一個類的成員函數聲明為虛函數後,這就意味著該成員函數在派生類中可能有不同的實現,也就是 說,該函數在派生類中可能需要定義與其基類虛函數原型相同的函數。

虛函數是動態聯編的基礎,當用基類類型的指針或引用的方法指向不同派生類對象時,系統會在程序 運行中根據所指向對象的不同自動選擇適當的函數,從而實現了運行時的多態性。

當通過基類指針或引用標識對象並調用成員函數時,由於基類指針可以指向該基類的不同派生類對象 ,因此存在需要動態聯編的可能性,但具體是否使用動態聯編,還要看所調用的是否是虛函數。

虛函數可以在一個或多個派生類中被重新定義,但它要求在派生類中重新定義時必須與基類中的函數 原型完全相同,包括函數名、返回值類型、參數個數和參數類型的順序。

只有類的成員函數才能聲明為虛函數,但類的構造函數以及全局函數和靜態成員函數不能聲明為虛函 數。

4.用基類指針指向公有派生類對象

指向基類的指針自然可以指向其公有派生類的對象。但是,由於基類指針本身的類型並沒有改變,因 此,基類指針僅能訪問派生類中的基類部分。

5.純虛函數與抽象類

在定義一個表達抽象概念的基類時,有時可能會無法給出某些成員函數的具體實現。這時,就可以將 這些函數聲明為純虛函數。

純需函數的聲明格式如下:

virtual 類型 函數名(參數表)=0;

聲明了純虛函數的基類只是用於繼承,僅作為一個接口,具體功能在其派生類中實現。

聲明了純虛函數的類,稱為抽象類。抽象類只能用作基類來派生新類,而不能用來創建對象。

相關文章

C++學習摘要之二:構造函數和析構函數

http://www.bianceng.cn/Programming/cplus/200911/12302.htm

C++學習摘要之一:類和對象

http://www.bianceng.cn/Programming/cplus/200911/12301.htm

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved