C++面向?qū)ο蟪绦蛟O計課件第六章 多態(tài)性與虛函數(shù)_第1頁
C++面向?qū)ο蟪绦蛟O計課件第六章 多態(tài)性與虛函數(shù)_第2頁
C++面向?qū)ο蟪绦蛟O計課件第六章 多態(tài)性與虛函數(shù)_第3頁
C++面向?qū)ο蟪绦蛟O計課件第六章 多態(tài)性與虛函數(shù)_第4頁
C++面向?qū)ο蟪绦蛟O計課件第六章 多態(tài)性與虛函數(shù)_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

19六月2025C++面向?qū)ο蟪绦蛟O計第六章多態(tài)性與虛函數(shù)6.1多態(tài)性概述6.2重載與再定義6.3運算符重載6.4虛函數(shù)6.5抽象類19六月2025C++面向?qū)ο蟪绦蛟O計6.1多態(tài)性概述6.1.1多態(tài)的類型6.1.2多態(tài)的實現(xiàn)19六月2025C++面向?qū)ο蟪绦蛟O計6.1.1多態(tài)的類型多態(tài)性是指同一個消息被不同類型的對象接收時產(chǎn)生不同的行為,特點就是一個接口,多個實現(xiàn)。C++中多態(tài)性按照類型可以分為強制多態(tài)、過載多態(tài)、包含多態(tài)和參數(shù)多態(tài)四種。強制多態(tài)是指通過語義操作,強制數(shù)據(jù)做本不屬于該類型數(shù)據(jù)的操作。編譯器內(nèi)部的數(shù)據(jù)的隱式轉(zhuǎn)換,比如3.0+4操作時轉(zhuǎn)換成3.0+4.0就屬于此種類型重載多態(tài)是指函數(shù)重載,同名的操作在不同的環(huán)境下有不同的行為。前面學習過的普通函數(shù)重載和將要學習的類成員函數(shù)重載、運算符重載都屬于此種類型。包含多態(tài)是指在同一類族中定義于不同類中的同名函數(shù)的多態(tài)行為。我們本章將要學習的虛函數(shù)就屬于此種類型。參數(shù)多態(tài)是指功能、結(jié)構(gòu)實現(xiàn)相同但所作用于的數(shù)據(jù)類型不同,也就是數(shù)據(jù)類型參數(shù)化的多態(tài)。第七章中的函數(shù)模板和類模板就屬于此種多態(tài)。19六月2025C++面向?qū)ο蟪绦蛟O計6.1.2多態(tài)的實現(xiàn)多態(tài)是指同一個消息被不同的對象接收產(chǎn)生不同的行為,因此,多態(tài)在實現(xiàn)的時候必須確定消息的操作對象。我們根據(jù)消息和對象相結(jié)合的時間分為兩種:在程序編譯連接階段完成的,也就是說在編譯的過程中確定了消息的操作對象,我們稱為靜態(tài)綁定。在程序運行階段完成的,也就是說在程序運行的過程中才確定消息的操作對象,我們稱為動態(tài)綁定。19六月2025C++面向?qū)ο蟪绦蛟O計6.2重載與再定義6.2.1函數(shù)的重載6.2.2函數(shù)的再定義

19六月2025C++面向?qū)ο蟪绦蛟O計6.2.1函數(shù)的重載函數(shù)重載是指功能相似,函數(shù)名相同但所帶參數(shù)不同的一組函數(shù)。這里的“所帶參數(shù)不同”既可能是參數(shù)的數(shù)據(jù)類型不同也可能是參數(shù)的個數(shù)不同。普通函數(shù)的重載。intabs(intval){returnval<0?–val:val;}floatabs(floatval){returnval>0?–val:val;}19六月2025C++面向?qū)ο蟪绦蛟O計6.2.1函數(shù)的重載類成員函數(shù)的重載。classTdate{private: intmonth,day,year;public: Tdate(); Tdate(intm,intd,inty);};Tdate::Tdate(){month=6;day=20;year=2002;cout<<month<<"/"<<day<<"/"<<year<<endl;}Tdate::Tdate(intm,intd,inty){ month=m;day=d;year=y; cout<<month<<"/"<<day<<"/"<<year<<endl;}19六月2025C++面向?qū)ο蟪绦蛟O計6.2.2函數(shù)的再定義函數(shù)的再定義是指派生類新增了和基類中函數(shù)名相同,所帶參數(shù)也相同的成員函數(shù)(如果參數(shù)不同就屬于函數(shù)重載)。派生類中函數(shù)再定義的時候,派生類中的函數(shù)成員覆蓋了基類中的同名函數(shù)成員,通過派生類對象調(diào)用該函數(shù)成員時,調(diào)用的是派生類中新增的同名函數(shù)成員。要想在派生類中訪問基類的同名成員,可以用前面講過的作用域限定符。派生類中函數(shù)再定義的時候,通過基類指針來訪問該函數(shù)成員時,訪問的是派生類從基類繼承的函數(shù)成員。19六月2025C++面向?qū)ο蟪绦蛟O計6.3運算符重載6.3.1運算符重載的規(guī)則6.3.2運算符重載為成員函數(shù)6.3.3運算符重載為友元函數(shù)

19六月2025C++面向?qū)ο蟪绦蛟O計6.3.1

運算符重載的規(guī)則運算符重載的規(guī)則如下:只能重載已有的運算符,不能定義新的運算符,也不能改變原有運算符的含義。運算符的優(yōu)先級、結(jié)合性和操作對象的個數(shù)不能改變。重載的運算符函數(shù)參數(shù)不能有默認參數(shù),不能全部是預定義數(shù)據(jù)類型。絕大部分重載的運算符函數(shù)都能被派生類繼承,賦值運算符除外。關系運算符“.”、作用域分辨符“::”、成員指針運算符“*”、sizeof運算符和三目運算符“?:”這五個運算符不能被重載。運算符重載為類的成員函數(shù)的語法形式:19六月2025C++面向?qū)ο蟪绦蛟O計6.3.1運算符重載的規(guī)則運算符重載為類的成員函數(shù)和友元函數(shù)的語法形式函數(shù)返回類型operator運算符(形式參數(shù)){

函數(shù)體;}函數(shù)返回類型operator運算符(形式參數(shù)){

函數(shù)體;}19六月2025C++面向?qū)ο蟪绦蛟O計6.3.2運算符重載為成員函數(shù)運算符重載為類的成員函數(shù),它就可以訪問類的數(shù)據(jù)成員。使用重載運算符的時候,通過類的對象來調(diào)用運算符重載函數(shù)。調(diào)用過程是隱式的,看起來和一般的運算表達式一樣,程序編譯的時候已經(jīng)轉(zhuǎn)換成對運算符函數(shù)的調(diào)用;。運算符操作對象給出是隱式的,一個運算符操作的是對象本身的數(shù)據(jù),即this指針指出。19六月2025C++面向?qū)ο蟪绦蛟O計6.3.2運算符重載為成員函數(shù)單目運算符重載應用舉例。classMyInt{private: intm_a; intm_b;public: MyInt(inta,intb); voidoperator-();};voidMyInt::operator-(){ m_a=-m_a; m_b=-m_b;}19六月2025C++面向?qū)ο蟪绦蛟O計6.3.2運算符重載為成員函數(shù)雙目運算符應用舉例。classMyNum{private: intnumber;public: MyNum(); MyNum(intnum); MyNumoperator+(MyNummynum);};MyNumMyNum::operator+(MyNummynum){ MyNumtemp; temp.number=number+mynum.number; returntemp;}19六月2025C++面向?qū)ο蟪绦蛟O計6.3.3運算符重載為友元函數(shù)運算符重載為類的友元函數(shù)也能夠訪問類的數(shù)據(jù)成員。只是運算符重載為類的友元函數(shù)時,運算符的操作對象都必須通過重載函數(shù)的形參傳入。運算符重載為類的友元函數(shù)應用舉例。19六月2025C++面向?qū)ο蟪绦蛟O計6.3.3類成員的訪問控制classComplex{private: floatreal,imag;public: Complex(){real=0;imag=0;} Complex(floatr,floati){real=r;imag=i;} friendComplexoperator+(constComplex&c1,constComplex&c2);};Complexoperator+(constComplex&c1,constComplex&c2){ Complextemp; temp.real=c1.real+c2.real; temp.imag=c1.imag+c2.imag; returntemp;}19六月2025C++面向?qū)ο蟪绦蛟O計6.4虛函數(shù)6.4.1一般虛函數(shù)成員6.4.2虛析構(gòu)函數(shù)19六月2025C++面向?qū)ο蟪绦蛟O計6.4.1一般虛函數(shù)成員C++中的虛函數(shù)機制,通過基類指針,就可以使屬于同一個類族的不同對象產(chǎn)生不同的行為,從而實現(xiàn)了運行過程中的多態(tài)。C++中聲明一般虛函數(shù)的語法規(guī)則如下:

virtual函數(shù)返回類型函數(shù)名(形參){

函數(shù)體;}19六月2025C++面向?qū)ο蟪绦蛟O計6.4.1一般虛函數(shù)成員虛函數(shù)應用舉例。classPoint{private: floatx,y;public: Point(floatpx,floatpy){x=px;y=py;} virtualfloatArea()const{return0;}};classRectangle:publicPoint{private: floatw,h;public: Rectangle(floatrx,floatry,floatrw,floatrh); floatArea()const{returnw*h;}};19六月2025C++面向?qū)ο蟪绦蛟O計6.4.2虛析構(gòu)函數(shù)C++聲明虛析構(gòu)函數(shù)的格式與一般析構(gòu)函數(shù)類似,也是在函數(shù)返回類型前面加上關鍵字virtual。C++中聲明一般虛函數(shù)的語法規(guī)則如下:類的析構(gòu)函數(shù)聲明為虛函數(shù),那么以它為基類派生的所有派生類的析構(gòu)函數(shù)也變成了虛函數(shù)。它的好處是,采用一個基類指針就可以調(diào)用所有派生類的析構(gòu)函數(shù),完成不同對象的清理工作。virtual~類名(){

函數(shù)體;}19六月2025C++面向?qū)ο蟪绦蛟O計6.4.2虛析構(gòu)函數(shù)虛析構(gòu)函數(shù)應用舉例。classStudent{public:Student(){cout<<"InStudentconstructor"<<endl;}virtual~Student(){cout<<"InStudentdestructor"<<endl;}};classGraduateStudent:publicStudent{public: GraduateStudent(); ~GraduateStudent();};GraduateStudent::GraduateStudent(){ cout<<"InGraduateStudentconstructor"<<endl;}GraduateStudent::~GraduateStudent(){ cout<<"InGraduateStudentdestructor"<<endl;}19六月2025C++面向?qū)ο蟪绦蛟O計6.5抽象類6.5.1純虛函數(shù)6.5.2抽象類19六月2025C++面向?qū)ο蟪绦蛟O計6.5.1純虛函數(shù)抽象類為一個類族提供了若干公共接口,這些接口是由純虛函數(shù)來聲明的。C++中純虛函數(shù)的聲明如下:純虛函數(shù)實際上就在一般虛函數(shù)基礎上加了個“=0”,聲明為純虛函數(shù)之后,就意味著是類的公共接口,不能再給出函數(shù)體的實現(xiàn)。純虛函數(shù)的具體實現(xiàn)代碼由派生類給。出我們可以比較一下虛函數(shù)和純虛函數(shù)的區(qū)別:一個有函數(shù)體,一個沒有函數(shù)體。virtual函數(shù)返回類型函數(shù)名(形參)=0;19六月2025C++面向?qū)ο蟪绦蛟O計6.5.2抽象類至少包含有一個純虛函數(shù)的類稱為抽象類。抽象類是為了保證一個類族共享一些公共接口,建立統(tǒng)一的操作界面而設計的類。從抽象類派生的類必須實現(xiàn)抽象類中所有的接口,即給出抽象類中所有純虛函數(shù)的實現(xiàn),否則它仍然是一個抽象類化對象。抽象類不能實例化,也就是不能用抽象類來定義一個對象。19六月2025C++面向?qū)ο蟪绦蛟O計6.5.2抽象類抽象類應用舉例。classPoint{private: floatx,y;public: Point(floatpx,floatpy){x=px;y=py;} v

溫馨提示

  • 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

提交評論