




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
學習目標了解靜態聯編和動態聯編的概念
掌握虛函數的定義和調用方法理解純虛函數和抽象類的概念8.1聯編的概念多態性是通過聯編來實現的。所謂聯編,是把函數調用與適當的函數代碼相關聯的動作,分為靜態聯編和動態聯編。靜態聯編在程序執行前完成,在編譯階段決定執行哪個同名函數被調用,這稱為靜態聯編;而在編譯階段不能決定執行哪個同名函數被調用,只有在執行階段才能依據要處理的對象類型來決定執行哪個類的成員函數,其所支持的多態性稱運行時的多態性,稱為動態聯編。是通過繼承和虛函數實現的8.2動態聯編和虛函數8.2.1虛函數的定義虛函數的定義格式如下:virtual<返回類型><函數名>(<參數列表>){<函數體>}說明(1)virtual關鍵字聲明的函數稱為虛函數。(2)如果某類的一個成員函數聲明為虛函數,則意味著該成員函數在派生類中可能有不同的實現。在基類的派生類中就可以定義一個其函數名、參數、返回類型均相同的虛函數。(3)當通過指針或引用來調用該虛函數時,將會采用動態聯編的方式。8.2動態聯編和虛函數8.2.2虛函數的調用通過對象指針或引用來調用虛函數時,調用到的虛函數由對象指針或對象引用所關聯的實際對象所決定。因此,對象指針或引用關聯到不同類的對象時,調用到的虛函數就不同,實現了動態多態性。所以,利用虛函數來實現動態多態性,必須滿足如下要求:(1)在基類中把成員函數定義為虛函數;(2)在派生類中定義與基類虛函數同名、同參數、同返回類型的成員函數,但函數體不同,以實現對不同對象的操作;(3)在main()函數中,通過對象指針或引用來調用虛函數。8.3純虛函數和抽象類8.3.1純虛函數純虛函數是一種特殊的虛函數,它只有函數的聲明,沒有具體實現函數的功能,要求各派生類根據實際需要定義自己的版本,純虛函數的聲明格式如下:
virtual<返回類型><函數名>(<參數表>)=0;說明由于純虛函數沒有函數體,所以在派生類中沒有重新定義純虛函數之前,是不可以被調用該函數的,也不可以被繼承。8.4靜態多態性與動態多態性的比較在C++中,靜態多態性具體表現為重載(overload);動態多態性具體表現為純虛函數和覆蓋(override)。另外,前面還提到了隱藏。8.5運算符重載運算符重載其實就是函數的重載,是一種重要的重載多態性。給已有運算符賦予更多的含義,使它能夠用于特定類的對象,執行特定的功能,而且使用形式與基本類型數據的形式相同。C++語言支持運算符重載,但許多高級語言(如Java語言)并不支持運算符重載。8.5.1運算符重載的一般規則運算符是C++系統內部定義的,它們具有特定的語法規則,如參數說明、運算順序、優先級別等。因此,運算符重載時必須尊遵守一定的規則,不是所有的運算符都允許重載,C++語言允許重載的運算符如表8-1所示。8.5運算符重載如表8-1所示。8.5運算符重載運算符重載時必須遵守如下原則:1.重載的運算符是C++已經存在的運算符,不能主觀臆造。2.運算符重載不能改變運算符的語法結構,即單目運算符只能重載為單目運算符,雙目運算符重載只能重載為雙目運算符。3.運算符重載不能改變C++語言中已定義的運算符優先順序和結合性。4.運算符重載一般不改變運算符的功能。例如,重載的“+”運算符不可以用來計算兩個對象的乘積。5.不能重載的運算符有:(1)sizeof()運算符;(2)成員運算符(.);(3)指向成員的指針運算符(*);(4)作用域運算符(::);(5)條件運算符(?:);6.編譯程序對運算符重載遵循函數重載的選擇規則。8.5運算符重載8.5.2運算符重載為成員函數運算符重載為類的成員函數的一般形式為:<類型><類名::>operator<運算符>([<形參表>]){
函數體;}說明(1)“類型”是作為函數的返回類型;(2)“類名”是重載該運算符的類;(3)“operator”是關鍵字,是重載運算符的標志;(4)“運算符”是要重載的運算符;(5)“形參表”表示該運算符所需要的操作數,雙目運算符重載為類的成員函數,它們包含一個形參,即運算符右則的操作數。8.5運算符重載1.雙目運算符重載為類成員函數雙目運算符有兩個操作數,通常在運算符的左右兩側,如a+b,a<b等。在重載雙目運算符函數中,一個操作數是對象本身的數據,由this指針給出,另一個操作數則需要通過運算符重載函數的參數表來傳遞。2.單目運算符重載為類成員函數單目運算符中有一個操作數,如!a,-b,&c,++i等,重載單目運算符的方法與重載雙目運算符的方法類似。但由于單目運算符只有一個操作數,因此運算符重載函數只有一個參數,且可以省略此參數。因為操作數由對象的this指針給出,就不需要任何參數。8.5運算符重載8.5.3運算符重載為友元函數運算符重載為類的友元函數的一般形式如下:friend<類型>operator<運算符>(<形參表>){
函數體;}說明(1)“類型”是作為函數的返回類型;(2)“operator”是關鍵字,是重載運算符的標志;(3)“運算符”是要重載的運算符;(4)“形參表”表示該運算符所需要的參數和類型;(5)“friend”是運算符重載為友元函數時,在函數類型說明之前使用的關鍵字。8.5運算符重載1.雙目運算符重載為類的友元函數重載為類的友元函數時,將沒有隱含的參數this指針。這樣,對于雙目運算符,友元函數有兩個參數。友元函數無需利用對象或其指針進行調用,但它可以自由地訪問對象的私有成員。2.單目運算符重載為類的友元函數單目運算符重載為類的成員函數時,一般不需要顯示說明參數。因為重載為類的成員函數時,總是隱含一個參數,該參數是this指針。當重載為類的友元函數時,由于不存在隱含的this指針,所以對單目運算符來說,友元函數必須有一個參數。8.6情景應用——訓練項目8.6.1項目1:抽象類的應用實例
【問題描述】利用抽象類提供統一接口技術,編寫一個程序計算正方形、球體和圓柱體的表面積和體積。【算法設計】(1)從正方形、球體和圓柱體的各種運算中抽象出一個公共基類container為抽象基類。(2)在抽象基類中,定義求表面積和體積的2個純虛函數。抽象類中定義一個公共的數據成員radius,可作為球的半經、正方體邊長、圓柱體的底面半經。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論