面向?qū)ο缶幊碳夹g(shù)與方法 課件 第7章多態(tài)_第1頁
面向?qū)ο缶幊碳夹g(shù)與方法 課件 第7章多態(tài)_第2頁
面向?qū)ο缶幊碳夹g(shù)與方法 課件 第7章多態(tài)_第3頁
面向?qū)ο缶幊碳夹g(shù)與方法 課件 第7章多態(tài)_第4頁
面向?qū)ο缶幊碳夹g(shù)與方法 課件 第7章多態(tài)_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

面向?qū)ο缶幊碳夹g(shù)與方法(C++)

第7章多態(tài)第7章多態(tài)第7章

多態(tài)

7.1多態(tài)性概述

7.2虛函數(shù)

7.2.1虛函數(shù)的聲明與應用

7.2.2虛析構(gòu)函數(shù)

7.3如何實現(xiàn)動態(tài)綁定

7.4純虛函數(shù)與抽象類

7.5小結(jié)

第7章多態(tài)7.1多態(tài)性概述

7.2虛函數(shù) 7.3如何實現(xiàn)動態(tài)綁定 7.4純虛函數(shù)與抽象類 7.5小結(jié)

第7章多態(tài)7.1多態(tài)性概述對于重載函數(shù),在調(diào)用函數(shù)處,編譯器能夠根據(jù)類型匹配情況確定要調(diào)用哪個函數(shù)。這個工作是在編譯連接階段進行的,稱為靜態(tài)綁定(staticbinding)或早期綁定(earlybinding)。面向?qū)ο蠖鄳B(tài)(polymorphism)的目的,是讓處理基類對象的程序代碼,能夠處理派生類對象?;蛘哒f,對于同樣的消息(函數(shù)調(diào)用),被不同類型對象接收時導致不同的行為。這個功能是通過虛函數(shù)實現(xiàn)的。虛函數(shù)機制使得函數(shù)調(diào)用與函數(shù)體的聯(lián)系可以在程序運行時確定,這稱為動態(tài)綁定(dynamicbinding),又稱為晚期綁定或運行時綁定。第7章多態(tài)7.1多態(tài)性概述 7.2虛函數(shù)

7.3如何實現(xiàn)動態(tài)綁定 7.4純虛函數(shù)與抽象類 7.5小結(jié)

第7章多態(tài)7.2虛函數(shù)7.2.1虛函數(shù)的聲明與應用將一個成員函數(shù)聲明為虛函數(shù),就是在前面添加關鍵字virtual。第7章多態(tài)這種在派生類中對virtual函數(shù)的再定義,稱為重寫(overriding),注意要與函數(shù)重載(overloading)與第6章中的函數(shù)同名屏蔽區(qū)分開。由于虛機制的存在,程序在運行時根據(jù)對象的類型去調(diào)用合適的成員函數(shù)。這樣的程序結(jié)構(gòu)具有很好的可擴展性。例如可以在基類的基礎上派生出任意的新類型,而函數(shù)test()不需做任何改變就可用于新類型的對象。1. 虛函數(shù)是成員函數(shù),但不會是靜態(tài)成員函數(shù)。2. 如果虛函數(shù)定義在類體外,則關鍵字virtual只能出現(xiàn)在類內(nèi)的函數(shù)聲明前。當使用作用域運算符“::”時,虛機制不再起作用。派生類中的對應函數(shù)接口必須與基類中的完全相同。對函數(shù)返回類型可以稍微放松要求,如果基類中的虛函數(shù)返回類型是A*(或A&),派生類中重寫的函數(shù)可以返回B*(或B&),其中B是A的public派生類。如果不滿足這些要求,則派生類中的同名函數(shù)就不是對基類虛函數(shù)的重寫,而是重新定義的一個函數(shù),即使帶有關鍵字virtual也是如此。如果原函數(shù)有默認形參值,就不要在派生類中再定義新的形參值。因為默認形參值是靜態(tài)綁定的,只能來自基類中的定義。在多層次繼承中,如果派生類沒有對基類的虛函數(shù)進行重寫,則自動調(diào)用繼承層次中最近的虛函數(shù)。使用虛函數(shù)時應注意以下幾點:第7章多態(tài)要想實現(xiàn)運行時的多態(tài),必須滿足三個基本條件:1)public繼承;2)虛函數(shù);3)通過指針(或引用)調(diào)用虛函數(shù)。第7章多態(tài)運行結(jié)果:Graduate::Show()Graduate::Show()UnivPerson::Show()Student::Study()Student::Eat()Graduate::Eat()Student::Study()Graduate::Show()第7章多態(tài)7.2虛函數(shù)7.2.2虛析構(gòu)函數(shù)構(gòu)造函數(shù)不能為虛函數(shù),而析構(gòu)函數(shù)可以是虛函數(shù)。如果基類的析構(gòu)函數(shù)是虛函數(shù),則所有派生類的析構(gòu)函數(shù)都自動為虛函數(shù)。將析構(gòu)函數(shù)聲明為虛函數(shù),可以使程序運行更加安全。運行結(jié)果:ConstructorofCPoint.ConstructorofRectangle.DestructorofCPoint.改成虛析構(gòu)函數(shù)后的運行結(jié)果:ConstructorofCPoint.ConstructorofRectangle.DestructorofRectangle.DestructorofCPoint.第7章多態(tài)7.1多態(tài)性概述 7.2虛函數(shù) 7.3如何實現(xiàn)動態(tài)綁定

7.4純虛函數(shù)與抽象類 7.5小結(jié)

第7章多態(tài)7.3如何實現(xiàn)動態(tài)綁定對于含虛函數(shù)的類,編譯器為每個類建立唯一的虛函數(shù)表vtable,表中存放該類的虛函數(shù)的地址,包括新聲明的以及繼承的虛函數(shù)。編譯器還為每個類加上一個數(shù)據(jù)成員vptr,這是一個指向虛函數(shù)表的指針。虛函數(shù)表中的順序,與類中虛函數(shù)的聲明順序一致。派生類會繼承基類的虛函數(shù)表,當在派生類中重寫虛函數(shù)時,表中元素存儲的地址將不再是基類虛函數(shù)的地址,而是派生類虛函數(shù)的地址。classA{public: intdata1; voidfun1(){} virtualvoidvfun1(){} virtualvoidvfun2(){}};

第7章多態(tài)classB:publicA{public: intdata2; voidfun1(){} virtualvoidvfun2(){}};第7章多態(tài)7.1多態(tài)性概述 7.2虛函數(shù) 7.3如何實現(xiàn)動態(tài)綁定 7.4純虛函數(shù)與抽象類7.5小結(jié)

第7章多態(tài)7.4純虛函數(shù)與抽象類在“形狀-點-圓-球”這樣的繼承關系中,“形狀”是比較抽象的概念,無法為其定義求面積的函數(shù),但可以在基類中聲明一個統(tǒng)一接口,在派生類中再給出求面積的實現(xiàn)。這樣的虛函數(shù)稱為純虛函數(shù):

virtual返回類型函數(shù)名(參數(shù)列表)=0; 注意純虛函數(shù)聲明中沒有函數(shù)體,與函數(shù)定義不同: virtualdoubleArea(){}含有純虛函數(shù)的類稱為抽象類。不能定義抽象類的對象,可以聲明抽象類引用或指向抽象類的指針。在抽象類基礎上派生出的新類,如果給出了所有純虛函數(shù)的實現(xiàn),就不再是抽象類,否則仍是抽象類。運行結(jié)果:50.265412.5664第7章多態(tài)7.1多態(tài)性概述 7.2虛函數(shù) 7.3如何實現(xiàn)動態(tài)綁定 7.4純虛函數(shù)與抽象類 7.5小結(jié)

第7章多態(tài)7.5小結(jié)虛函數(shù)是用virtual關鍵字聲明的非靜態(tài)成員函數(shù)。虛函數(shù)機制使得函數(shù)調(diào)用與函數(shù)體的聯(lián)系可以在程序運行時確定。要想實現(xiàn)運行時的多態(tài),必須滿足三個條件:1)public繼承;2)虛函數(shù);3)通過指針(或引用)調(diào)用虛函數(shù)。構(gòu)造函數(shù)不能是虛函數(shù),析構(gòu)函數(shù)可以是虛函數(shù),而且常常被聲明為虛函數(shù)。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論