雷電面向對象第5章多態(tài)_第1頁
雷電面向對象第5章多態(tài)_第2頁
雷電面向對象第5章多態(tài)_第3頁
雷電面向對象第5章多態(tài)_第4頁
雷電面向對象第5章多態(tài)_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第5章 多 態(tài)面向對象程序設計的基本特征之一:多 態(tài)上海大學機電工程與自動化學院 雷電什么是多態(tài)?字面意思:多種形態(tài)例:鉛筆移動,杯子移動,房子移動移動操作(函數(shù))具有多態(tài)性C+含義:多態(tài)性是針對函數(shù)來說的,函數(shù)的執(zhí)行是在運行時才動態(tài) 綁定到函數(shù)的入口地址。p對象-移動( );其p對象是基類型,運行時偵測實際類型確定調用函數(shù)(運行時才知道)! 如果 對象是鉛筆: p對象-鉛筆:移動( );如果 對象是杯子: p對象-杯子:移動( );其移動( )函數(shù)具有多態(tài)性,移動( )函數(shù)是虛函數(shù)。面向對象的多態(tài)性不但使程序結構更接近現(xiàn)實世界,且使開發(fā)可互操作的組件成為可能. Ex5_1實現(xiàn)的語法規(guī)則:上海

2、大學機電工程與自動化學院 雷電例:繪圖軟件系統(tǒng)中的設計 重畫抽象基類虛函數(shù) draw上海大學機電工程與自動化學院 雷電5.1.1 C+多態(tài)的前提條件必須存在一個類的繼承體系。多態(tài)性的函數(shù)是體系中類的成員函數(shù),且通過關鍵字virtual修飾,稱為虛函數(shù)。虛函數(shù)的多態(tài)調用是通過基類對象引用或指針。上海大學機電工程與自動化學院 雷電語法:class virtual ;class : public virtual ;/基類的成員函數(shù)顯式聲明為虛函數(shù),派生類相應的成員函數(shù)沒有顯式聲明也自動成為虛函數(shù)。void xFunc (基類名 *pObj) pObj- virtualFunction( );Ex5_

3、1 比較virtual的作用上海大學機電工程與自動化學院 雷電5.1 運行期綁定、編譯期綁定編譯期綁定:在編譯期就確定了函數(shù)調用的入口地址。運行期綁定:在編譯期并沒有確定了函數(shù)調用的入口地址,而是在程序運行時。問題:怎樣才能找到所運行的函數(shù)入口地址?根據(jù)什么?答:系統(tǒng)對各個虛函數(shù)建有入口地址表,在運行時根據(jù)this指針查找相應的入口地址。上海大學機電工程與自動化學院 雷電面向對象的類庫的體系結構class Bpublic:virtual void OnDraw()coutB:m()endl;void Run()if( getMsg()=WM_PAINT)OnDraw();/.;class D

4、: public Bpublic:virtual void OnDraw()coutD:m()vtbl.vm(); p-m();void Func( BC *p) p-vm();/哪個m()? p-m();/哪個m()?多態(tài)性的運行開銷比較: 虛表占用的內存,訪問虛表.但顯然開銷大不了多少.bvtblbvtbldstruct Vtbl void (*vm)(); &BC:vm&DC:vm內存映射:上海大學機電工程與自動化學院 雷電5.1.4 構造函數(shù)與析構函數(shù)構造函數(shù)不能是虛函數(shù)。析構函數(shù)可以是虛函數(shù)?;惖奈鰳嫼瘮?shù)聲明為虛函數(shù)那么也自動為虛函數(shù)(為清晰,最好還是用virtual顯式修飾。)5

5、.1.6 靜態(tài)成員函數(shù),頂層函數(shù)不可能是虛函數(shù)(因沒有this指針)上海大學機電工程與自動化學院 雷電5.3 重載、覆蓋、遮蔽各種函數(shù)重名的情況:1)頂層函數(shù)2)在一個類中3)基類與派生類中4)不同的基類中5)不同的派生類中上海大學機電工程與自動化學院 雷電5.3.1重載函數(shù)同名,但具有不同的函數(shù)簽名。5.3.3 遮蔽派生類中的函數(shù),遮蔽基類的同名非虛函數(shù),即使是不同簽名。(即基類派生類間的重載失效.)5.3.2 覆蓋(override )派生類中的函數(shù),覆蓋基類的相同簽名虛函數(shù),動態(tài)綁定,多態(tài)性。上海大學機電工程與自動化學院 雷電5.2 示例程序:影片管理系統(tǒng)上海大學機電工程與自動化學院 雷

6、電菜單:1.Open2.Add Data1)type (Film/DirectorCut/ForeignFilm)2)info3.Output Data4.Save5.Quit上海大學機電工程與自動化學院 雷電5.4 抽象基類5.4.1 純虛成員函數(shù)class Apublic:virtual int Func(int a) = 0 ;注意:沒有實現(xiàn)部分.5.4.2抽象類含有純虛成員函數(shù)的類。抽象類作為基類使用。抽象類不能實例化。例: A a; X上海大學機電工程與自動化學院 雷電抽象基類作用:使用虛成員函數(shù)是為了多態(tài)性,為了使類體系具有一致的用戶接口,但對于頂層的基類,可能是高度抽象,沒有實際

7、的代碼可寫,于是使用虛成員函數(shù),可節(jié)省內存,可使各種組件的互操作成為可能。例:微軟的組件對象模型COM的基礎struct IUnknownvirtual LONG QueryInterface(REFIID iid, void * ppvObject )=0;virtual ULONG AddRef(void)=0;virtual ULONG Release(void)=0; Ex5_4上海大學機電工程與自動化學院 雷電5.5 運行期類型識別5.5.3 類型轉換1.強制轉換 2. static_cast 3. dynamic_cast例:BC *pbc=new DC;DC *pdc= (DC*

8、)pbc; /1DC *pdc= static_cast(pbc); /2DC *pdc= dynamic_cast(pbc); /3DC &dc= (DC&)(*pbc); /1DC &dc= static_cast(*pbc); /2DC &dc= dynamic_cast(*pbc); /3區(qū)別:若轉換不成功, dynamic_cast的結果為NULL(0),且只能用于多態(tài)性類型能動態(tài)類型識別上海大學機電工程與自動化學院 雷電5.5.4 typeid操作符格式typeid(表達式)=typeid(類型)例:class BC virtual void m();class DC : publ

9、ic BC ; BC *p=new DC; int x=5;typeid( x) = typeid (int ) / truetypeid( p) = typeid (BC *) / truetypeid( p) = typeid (DC *) / false typeid( *p) = typeid (BC) / falsetypeid( *p) = typeid (DC) / true注意:基類必須有虛函數(shù),上面才對。上海大學機電工程與自動化學院 雷電VC+ 6.0 上海大學機電工程與自動化學院 雷電面向對象程序設計方法小結組合: 組合了其它對象class Window Button bn; ;優(yōu)點:封裝性好 , 專注于一項任務. 缺點:系統(tǒng)中的對象可能過多 繼承:繼承基類,擴展改變基類class Circle : public Point;優(yōu)點:容易進行新的實現(xiàn),因為其大多數(shù)可繼承而來。缺點 :破壞了封裝性,當父類的實現(xiàn)更改時,子類也不得不隨之更

溫馨提示

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

評論

0/150

提交評論