![第八講 多態(tài)性與虛函數(shù)_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/14/4a5a610f-c212-4e6c-8a9f-585fe345d49a/4a5a610f-c212-4e6c-8a9f-585fe345d49a1.gif)
![第八講 多態(tài)性與虛函數(shù)_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/14/4a5a610f-c212-4e6c-8a9f-585fe345d49a/4a5a610f-c212-4e6c-8a9f-585fe345d49a2.gif)
![第八講 多態(tài)性與虛函數(shù)_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/14/4a5a610f-c212-4e6c-8a9f-585fe345d49a/4a5a610f-c212-4e6c-8a9f-585fe345d49a3.gif)
![第八講 多態(tài)性與虛函數(shù)_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/14/4a5a610f-c212-4e6c-8a9f-585fe345d49a/4a5a610f-c212-4e6c-8a9f-585fe345d49a4.gif)
![第八講 多態(tài)性與虛函數(shù)_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/14/4a5a610f-c212-4e6c-8a9f-585fe345d49a/4a5a610f-c212-4e6c-8a9f-585fe345d49a5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、1第八講第八講 多態(tài)性多態(tài)性西安理工大學理學院西安理工大學理學院冉占軍冉占軍C+語言程序設計2本講主要內容本講主要內容l多態(tài)性多態(tài)性l運算符重載運算符重載l虛函數(shù)虛函數(shù)l純虛函數(shù)純虛函數(shù)l抽象類抽象類3多態(tài)性的概念多態(tài)性的概念l多態(tài)性是面向對象程序設計的重要特多態(tài)性是面向對象程序設計的重要特征之一。征之一。l多態(tài)性是指發(fā)出同樣的消息被不同類多態(tài)性是指發(fā)出同樣的消息被不同類型的對象接收時導致完全不同的行為。型的對象接收時導致完全不同的行為。l多態(tài)的實現(xiàn):多態(tài)的實現(xiàn): 函數(shù)重載 運算符重載 虛函數(shù)4問題舉例問題舉例復數(shù)的運算復數(shù)的運算class complex/復數(shù)類聲明復數(shù)類聲明public:c
2、omplex(double r=0.0,double i=0.0)real=r;imag=i; /構造函數(shù)構造函數(shù)void display();/顯示復數(shù)的值顯示復數(shù)的值private:double real;double imag;運算符重載5問題舉例問題舉例復數(shù)的運算復數(shù)的運算l用用“+”、“-”能夠實現(xiàn)復數(shù)的加減運能夠實現(xiàn)復數(shù)的加減運算嗎?算嗎?l實現(xiàn)復數(shù)加減運算的方法實現(xiàn)復數(shù)加減運算的方法 重載重載“+”、“-”運算符運算符運算符重載6運算符重載的實質運算符重載的實質l運算符重載是對已有的運算符賦予多重含運算符重載是對已有的運算符賦予多重含義義l必要性必要性 C+中預定義的運算符其運算
3、對象只能是基本數(shù)據(jù)類型,而不適用于用戶自定義類型(如類)l實現(xiàn)機制實現(xiàn)機制 將指定的運算表達式轉化為對運算符函數(shù)的調用,運算對象轉化為運算符函數(shù)的實參。 編譯系統(tǒng)對重載運算符的選擇,遵循函數(shù)重載的選擇原則。運算符重載7運算符重載規(guī)則和限制規(guī)則和限制l可以重載可以重載C+中除下列運算符外的所中除下列運算符外的所有運算符:有運算符:. .* : ?:l只能重載只能重載C+語言中已有的運算符,語言中已有的運算符,不可臆造新的。不可臆造新的。l不改變原運算符的優(yōu)先級和結合性。不改變原運算符的優(yōu)先級和結合性。l不能改變操作數(shù)個數(shù)。不能改變操作數(shù)個數(shù)。l經(jīng)重載的運算符,其操作數(shù)中至少應經(jīng)重載的運算符,其操
4、作數(shù)中至少應該有一個是自定義類型。該有一個是自定義類型。8兩種形式兩種形式l重載為類成員函數(shù)。重載為類成員函數(shù)。l重載為友元函數(shù)。重載為友元函數(shù)。運算符重載9運算符函數(shù)運算符函數(shù)l定義形式定義形式函數(shù)類型 operator 運算符(形參) .l重載為類成員函數(shù)時重載為類成員函數(shù)時 參數(shù)個數(shù)參數(shù)個數(shù)=原操作數(shù)個數(shù)原操作數(shù)個數(shù)-1 (后置(后置+、-除外)除外)l重載為友元函數(shù)時重載為友元函數(shù)時 參數(shù)個數(shù)參數(shù)個數(shù)=原操作數(shù)個數(shù)原操作數(shù)個數(shù),且至少應該有一個自定義類型的形參。且至少應該有一個自定義類型的形參。運算符重載10運算符成員函數(shù)的設計運算符成員函數(shù)的設計l雙目運算符雙目運算符 B 如果要重載
5、 B 為類成員函數(shù),使之能夠實現(xiàn)表達式 oprd1 B oprd2,其中 oprd1 為A 類對象,則 B 應被重載為 A 類的成員函數(shù),形參類型應該是 oprd2 所屬的類型。 經(jīng)重載后,表達式 oprd1 B oprd2 相當于 oprd1.operator B(oprd2)運算符重載11運算符重載 例例 8.1 將將“+”+”、“-”-”運算重載為復數(shù)類運算重載為復數(shù)類的成員函數(shù)。的成員函數(shù)。l 規(guī)則規(guī)則: 實部和虛部分別相加減。實部和虛部分別相加減。l 操作數(shù)操作數(shù): 兩個操作數(shù)都是復數(shù)類的對象。兩個操作數(shù)都是復數(shù)類的對象。#includeclass complex/復數(shù)類聲明復數(shù)類聲
6、明public:/外部接口外部接口complex(double r=0.0,double i=0.0)real=r;imag=i; /構造函數(shù)構造函數(shù)complex operator + (complex c2); /+重載為成員函數(shù)重載為成員函數(shù)complex operator - (complex c2); /-重載為成員函數(shù)重載為成員函數(shù)void display(); /輸出復數(shù)輸出復數(shù)private:/私有數(shù)據(jù)成員私有數(shù)據(jù)成員double real;/復數(shù)實部復數(shù)實部double imag;/復數(shù)虛部復數(shù)虛部;complex complex:operator +(complex c2)
7、 /重載函數(shù)實現(xiàn)重載函數(shù)實現(xiàn)complex c;c.real=c2.real+real;c.imag=c2.imag+imag;return c;complex complex:operator -(complex c2) /重載函數(shù)實現(xiàn)重載函數(shù)實現(xiàn)complex c;c.real=real-c2.real;c.imag=imag-c2.imag;return c;void complex:display() cout(real,imag)endl; void main() /主函數(shù)主函數(shù) complex c1(5,4),c2(2,10),c3; /聲明復數(shù)類的對象聲明復數(shù)類的對象coutc1
8、=;c1.display();coutc2=;c2.display();c3=c1-c2;/使用重載運算符完成復數(shù)減法使用重載運算符完成復數(shù)減法coutc3=c1-c2=;c3.display();c3=c1+c2;/使用重載運算符完成復數(shù)加法使用重載運算符完成復數(shù)加法coutc3=c1+c2=;c3.display();程序輸出的結果為:程序輸出的結果為:c1=(5,4)c2=(2,10)c3=c1-c2=(3,-6)c3=c1+c2=(7,14)17運算符成員函數(shù)的設計運算符成員函數(shù)的設計l前置單目運算符前置單目運算符 U 如果要重載 U 為類成員函數(shù),使之能夠實現(xiàn)表達式 U oprd,其
9、中 oprd 為A類對象,則 U 應被重載為 A 類的成員函數(shù),無形參。 經(jīng)重載后,表達式 U oprd 相當于 oprd.operator U()運算符重載18運算符成員函數(shù)的設計運算符成員函數(shù)的設計l后置單目運算符后置單目運算符 +和和- 如果要重載 +或-為類成員函數(shù),使之能夠實現(xiàn)表達式 oprd+ 或 oprd- ,其中 oprd 為A類對象,則 +或- 應被重載為 A 類的成員函數(shù),且具有一個 int 類型形參。 經(jīng)重載后,表達式 oprd+ 相當于 oprd.operator +(0)運算符重載19例例8.2l運算符前置運算符前置+和后置和后置+重載為時鐘類重載為時鐘類的成員函數(shù)。
10、的成員函數(shù)。l前置單目運算符,重載函數(shù)沒有形參,前置單目運算符,重載函數(shù)沒有形參,對于后置單目運算符,重載函數(shù)需要對于后置單目運算符,重載函數(shù)需要有一個整型形參。有一個整型形參。l操作數(shù)是時鐘類的對象。操作數(shù)是時鐘類的對象。l實現(xiàn)時間增加實現(xiàn)時間增加1秒鐘。秒鐘。運算符重載#includeclass Clock /時鐘類聲明時鐘類聲明public:/外部接口外部接口Clock(int NewH=0, int NewM=0, int NewS=0);void ShowTime();void operator +(); /前置單目運算符重載前置單目運算符重載void operator +(int)
11、; /后置單目運算符重載后置單目運算符重載private:/私有數(shù)據(jù)成員私有數(shù)據(jù)成員int Hour, Minute, Second;void Clock:operator +()/前置單目運算符重載函數(shù)前置單目運算符重載函數(shù) Second+;if(Second=60) Second=Second-60;Minute+;if(Minute=60) Minute=Minute-60;Hour+;Hour=Hour%24;cout=60) Second=Second-60;Minute+;if(Minute=60) Minute=Minute-60;Hour+;Hour=Hour%24;coutC
12、lock+: ;/其它成員函數(shù)的實現(xiàn)略其它成員函數(shù)的實現(xiàn)略void main()Clock myClock(23,59,59);coutFirst time output:;myClock.ShowTime();myClock+;myClock.ShowTime();+myClock;myClock.ShowTime();程序運行結果為:程序運行結果為:First time output:23:59:59Clock+: 0:0:0+Clock: 0:0:125運算符友元函數(shù)的設計運算符友元函數(shù)的設計l如果需要重載一個運算符,使之能夠如果需要重載一個運算符,使之能夠用于操作某類對象的私有成員,可
13、以用于操作某類對象的私有成員,可以將此運算符重載為該類的友元函數(shù)。將此運算符重載為該類的友元函數(shù)。l函數(shù)的形參代表依自左至右次序排列函數(shù)的形參代表依自左至右次序排列的各操作數(shù)。的各操作數(shù)。l后置單目運算符后置單目運算符 +和和-的重載函數(shù),的重載函數(shù),形參列表中要增加一個形參列表中要增加一個int,但不必寫,但不必寫形參名。形參名。運算符重載26運算符友元函數(shù)的設計運算符友元函數(shù)的設計l雙目運算符雙目運算符 B重載后,重載后,表達式表達式oprd1 B oprd2 等同于等同于operator B(oprd1,oprd2 )l前置單目運算符前置單目運算符 B重載后,重載后,表達式表達式 B o
14、prd 等同于等同于operator B(oprd )l后置單目運算符后置單目運算符 +和和-重載后,重載后,表達式表達式 oprd B 等同于等同于operator B(oprd,0 )運算符重載27例例8-3l將將+ +、- -(雙目)重載為復數(shù)類的友元(雙目)重載為復數(shù)類的友元函數(shù)。函數(shù)。l兩個操作數(shù)都是復數(shù)類的對象。兩個操作數(shù)都是復數(shù)類的對象。運算符重載#includeclass complex/復數(shù)類聲明復數(shù)類聲明public:/外部接口外部接口complex(double r=0.0,double i=0.0) real=r; imag=i; /構造函數(shù)構造函數(shù)friend com
15、plex operator + (complex c1,complex c2);/運算符運算符+ +重載為友元函數(shù)重載為友元函數(shù)friend complex operator - (complex c1,complex c2);/運算符運算符- -重載為友元函數(shù)重載為友元函數(shù)void display(); /顯示復數(shù)的值顯示復數(shù)的值private:/私有數(shù)據(jù)成員私有數(shù)據(jù)成員double real;double imag;complex operator +(complex c1,complex c2)/運算運算符重載友元函數(shù)實現(xiàn)符重載友元函數(shù)實現(xiàn) return complex(c2.real+
16、c1.real, c2.imag+c1.imag);complex operator -(complex c1,complex c2)/運算符重載運算符重載友元函數(shù)實現(xiàn)友元函數(shù)實現(xiàn) return complex(c1.real-c2.real, c1.imag-c2.imag);/ 其它函數(shù)和主函數(shù)同例其它函數(shù)和主函數(shù)同例8.130靜態(tài)聯(lián)編與動態(tài)聯(lián)編靜態(tài)聯(lián)編與動態(tài)聯(lián)編l聯(lián)編聯(lián)編(binding:綁定綁定): 程序自身彼此關聯(lián)的過程,確定程序中的操作調用與執(zhí)行該操作的代碼間的關系。l靜態(tài)聯(lián)編(靜態(tài)束定)靜態(tài)聯(lián)編(靜態(tài)束定) 聯(lián)編工作出現(xiàn)在編譯階段,用對象名或者類名來限定要調用的函數(shù)。l動態(tài)聯(lián)編動
17、態(tài)聯(lián)編 聯(lián)編工作在程序運行時執(zhí)行,在程序運行時才確定將要調用的函數(shù)。#includeclass Point public:Point(double i, double j) x=i; y=j;double Area() const return 0.0; private:double x, y;class Rectangle:public Point public:Rectangle(double i, double j, double k, double l);double Area() const return w*h; private:double w,h;例 8.8Rectangle:
18、Rectangle(double i, double j, double k, double l) :Point(i,j) w=k; h=l; void fun(Point &s) coutArea=s.Area()endl; void main()Rectangle rec(3.0, 5.2, 15.0, 25.0);fun(rec);運行結果:運行結果:Area=0#includeclass Point public: Point(double i, double j) x=i; y=j; virtual double Area() const return 0.0; privat
19、e:double x, y;class Rectangle:public Point public: Rectangle(double i, double j, double k, double l); virtual double Area() const return w*h; private:double w,h;/其它函數(shù)同例其它函數(shù)同例 8.8例 8.9void fun(Point &s) coutArea=s.Area()endl; void main()Rectangle rec(3.0, 5.2, 15.0, 25.0);fun(rec);運行結果運行結果:Area=3
20、7535虛函數(shù)虛函數(shù)l虛函數(shù)是動態(tài)聯(lián)編的基礎。虛函數(shù)是動態(tài)聯(lián)編的基礎。l虛函數(shù)是類的非靜態(tài)的成員函數(shù)。虛函數(shù)是類的非靜態(tài)的成員函數(shù)。l在類的定義中,在函數(shù)原型之前寫在類的定義中,在函數(shù)原型之前寫virtual。lvirtual 只用來說明類定義中的原型,不能用在函數(shù)實現(xiàn)只用來說明類定義中的原型,不能用在函數(shù)實現(xiàn)時。時。l具有繼承性,基類中定義了虛函數(shù),派生類中無論是否具有繼承性,基類中定義了虛函數(shù),派生類中無論是否說明,同原型函數(shù)都自動為虛函數(shù)。說明,同原型函數(shù)都自動為虛函數(shù)。l本質:不是重載定義而是覆蓋定義。(不僅覆蓋虛函數(shù),本質:不是重載定義而是覆蓋定義。(不僅覆蓋虛函數(shù),而且覆蓋所有繼承
21、過來的同名函數(shù),要求基類和繼承類而且覆蓋所有繼承過來的同名函數(shù),要求基類和繼承類中函數(shù)的參數(shù)一致)中函數(shù)的參數(shù)一致)l調用方式:通過基類指針或引用,執(zhí)行時會調用方式:通過基類指針或引用,執(zhí)行時會根據(jù)根據(jù)指針指向的對象的類指針指向的對象的類,決定調用哪個函數(shù)。,決定調用哪個函數(shù)。36例例 8.4#include class B0 /基類基類B0聲明聲明public:/外部接口外部接口virtual void display() coutB0:display()endl; /虛成員函數(shù)虛成員函數(shù);class B1: public B0/公有派生公有派生 public: void display()
22、 coutB1:display()endl; ;class D1: public B1/公有派生公有派生 public: void display() coutD1:display()display(); void main() /主函數(shù)主函數(shù) B0 b0, *p;/聲明基類對象和指針聲明基類對象和指針B1 b1;/聲明派生類對象聲明派生類對象D1 d1;/聲明派生類對象聲明派生類對象p=&b0;fun(p);/調用基類調用基類B0函數(shù)成員函數(shù)成員p=&b1;fun(p);/調用派生類調用派生類B1函數(shù)成員函數(shù)成員p=&d1;fun(p);/調用派生類調用派生類D1函數(shù)
23、成員函數(shù)成員程序的運行結果為:程序的運行結果為:B0:display()B1:display()D1:display()40抽象類的一般形式抽象類的一般形式帶有純虛函數(shù)的類稱為抽象類帶有純虛函數(shù)的類稱為抽象類:class 類名類名 virtual 類型 函數(shù)名(參數(shù)表)=0; /純虛函數(shù)純虛函數(shù) .純虛函數(shù)與抽象類41作用作用l抽象類為抽象和設計的目的而建立,抽象類為抽象和設計的目的而建立,將有關的數(shù)據(jù)和行為組織在一個繼承將有關的數(shù)據(jù)和行為組織在一個繼承層次結構中,保證派生類具有要求的層次結構中,保證派生類具有要求的行為。行為。l對于暫時無法實現(xiàn)的函數(shù),可以聲明對于暫時無法實現(xiàn)的函數(shù),可以聲明
24、為純虛函數(shù),留給派生類去實現(xiàn)。為純虛函數(shù),留給派生類去實現(xiàn)。純虛函數(shù)與抽象類42注意注意l抽象類只能作為抽象類只能作為基類基類來使用。來使用。l不能定義抽象類的對象。不能定義抽象類的對象。l構造函數(shù)不能是虛函數(shù),析構函數(shù)可構造函數(shù)不能是虛函數(shù),析構函數(shù)可以是虛函數(shù)。以是虛函數(shù)。純虛函數(shù)與抽象類43例例 8.5#include class B0 /抽象基類抽象基類B0聲明聲明public: /外部接口外部接口virtual void display( )=0; /純虛函數(shù)成員純虛函數(shù)成員;純虛函數(shù)與抽象類class B1: public B0/公有派生公有派生public:void display()coutB1:display()endl; /虛成員函數(shù)虛成員函數(shù);class D1: public B1/公有派生公有派生public:void display()coutD1:display()display(); void main() /主函數(shù)主函數(shù) B0 *p;/聲明抽象基類指針,不能聲明對象聲明抽象基類指針,不能聲明對象B1 b1;/聲明派生類對象聲明派生類對象
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 保險公司車輛抵押合同范本
- 保健品供貨合同范本
- 代理酒水銷售合同范例
- 買車合同買賣合同范例
- 會展廣告活動合同范本
- 2025年中國產(chǎn)品校準器市場調查研究報告
- 2025年買賣合同范本(官方版律師編寫)
- 2025年人壽保險意外傷害責任合同
- 2025年住宅裝修項目工程進度確保合同
- 2025年住宅瓷磚選購合同
- 三年內無重大違法記錄聲明
- 第六章-主成分分析法
- 2024簡單的租房合同樣本下載
- 2025屆浙江省杭州七縣高三第一次調研測試生物試卷含解析
- 2022版義務教育(歷史)課程標準(附課標解讀)
- 中國慢性腎臟病早期評價與管理指南2023
- 新人教版五年級上冊數(shù)學應用題大全及答案
- 【家庭教育】0-3歲嬰幼兒早教訓練方案
- 國家中長期科技發(fā)展規(guī)劃(2021-2035)
- 建筑工人實名制管理制度及實施方案
- 《養(yǎng)老護理員》-課件:協(xié)助老年人穿脫簡易矯形器
評論
0/150
提交評論