




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、關(guān)于多態(tài)性和虛函數(shù)第1頁,共30頁,2022年,5月20日,19點(diǎn)43分,星期三多態(tài)性 不同的對(duì)象接收到相同的消息時(shí)產(chǎn)生多種完全不同的行為的現(xiàn)象稱為多態(tài)性。 C+支持兩種多態(tài)性:編譯時(shí)的多態(tài)性和運(yùn)行時(shí)多態(tài)性。編譯時(shí)的多態(tài)性使用重載來獲得,運(yùn)行時(shí)的多態(tài)性通過使用繼承和虛函數(shù)獲得。 C+語言中,重載包括函數(shù)重載和運(yùn)算符重載。第2頁,共30頁,2022年,5月20日,19點(diǎn)43分,星期三6.1 運(yùn)算符重載6.1.1 運(yùn)算符重載概述6.1.2 用成員函數(shù)重載運(yùn)算符6.1.3 用友元函數(shù)重載運(yùn)算符6.1.4 幾個(gè)常用運(yùn)算符的重載第3頁,共30頁,2022年,5月20日,19點(diǎn)43分,星期三6.1.1 運(yùn)
2、算符重載概述1. 運(yùn)算符重載定義 C+中預(yù)定義的運(yùn)算符的操作對(duì)象只能是基本數(shù)據(jù)類型,運(yùn)算符重載是對(duì)運(yùn)算符進(jìn)行重新定義,賦予已有符號(hào)新功能的要求。不能重載的運(yùn)算符是:(1) 成員訪問運(yùn)算符.(2) 作用域運(yùn)算符(3) 條件運(yùn)算符?:(4) 成員指針運(yùn)算符*(5) 編譯預(yù)處理命令的開始符號(hào)#第4頁,共30頁,2022年,5月20日,19點(diǎn)43分,星期三2. 運(yùn)算符重載的規(guī)則 C+中的運(yùn)算符除了少數(shù)幾個(gè)以外,幾乎全部可以重載,程序員不能定義新的運(yùn)算符,只能重載已有的這些運(yùn)算符。 重載之后運(yùn)算符的優(yōu)先級(jí)和結(jié)合性都不能改變。 運(yùn)算符重載是針對(duì)新類型數(shù)據(jù)的實(shí)際需要,對(duì)原有運(yùn)算符進(jìn)行適當(dāng)?shù)母脑臁?. 運(yùn)算符
3、重載的形式 運(yùn)算符重載可以使用成員函數(shù)和友元函數(shù)兩種形式。運(yùn)算符重載的實(shí)質(zhì)就是函數(shù)重載。第5頁,共30頁,2022年,5月20日,19點(diǎn)43分,星期三6.1.2 用成員函數(shù)重載運(yùn)算符 在類定義體中聲明運(yùn)算符函數(shù)的形式為: type operator (參數(shù)表) 其中為運(yùn)算符符號(hào) 若運(yùn)算符是一元的,則參數(shù)表為空,此時(shí)當(dāng)前對(duì)象作為此運(yùn)算符的單操作數(shù);若運(yùn)算符是二元的,則參數(shù)表中有一個(gè)操作數(shù),此時(shí)當(dāng)前對(duì)象作為此運(yùn)算符的左操作數(shù),參數(shù)表中的操作數(shù)作為此運(yùn)算符的右操作數(shù)。 運(yùn)算符函數(shù)的定義如下:type 類名:operator (參數(shù)表) / 運(yùn)算符處理程序代碼 重載運(yùn)算符的使用方法同原運(yùn)算符一樣,只是
4、它的操作數(shù)一定要是定義它的特定類的對(duì)象。第6頁,共30頁,2022年,5月20日,19點(diǎn)43分,星期三【例6.1】用成員函數(shù)重載運(yùn)算符+#includeclass point private: float x,y; public: point(float xx=0, float yy=0)x=xx; y=yy; float get_x()return x; float get_y()return y; point operator +(point q);/重載運(yùn)算符“+” ;point point:operator +(point q) return point(x+q.x, y+q.y);
5、void main() point p1(3,3), p2(2,2), p3;/聲明point類的對(duì)象 p3=p1+p2;或p1. operator +(p2)/兩點(diǎn)相加 coutp1+p2:x=p3.get_x(),y=p3.get_y()endl;第7頁,共30頁,2022年,5月20日,19點(diǎn)43分,星期三【例6.2】用成員函數(shù)重載運(yùn)算符+#include point point:operator +()class point +x; private: +y;float x,y; return *this; public: point(float xx=0,float yy=0)x=xx
6、;y=yy;float get_x()return x;float get_y()return y; point operator +();/重載前置運(yùn)算符“+”;void main() point p1(10,10); +p1;或 coutp1:x=p1.get_x(),y=p1.get_y()endl;第8頁,共30頁,2022年,5月20日,19點(diǎn)43分,星期三6.1.3 用友元函數(shù)重載運(yùn)算符friend type operator (參數(shù)表);注意友元函數(shù)不屬于任何類,它沒有this指針,這與成員函數(shù)完全不同。若運(yùn)算符是一元的,則參數(shù)表中有一個(gè)操作數(shù);若運(yùn)算符是二元的,則參數(shù)表中有兩個(gè)
7、操作數(shù)。友元運(yùn)算符函數(shù)與成員運(yùn)算符函數(shù)的主要區(qū)別在其參數(shù)個(gè)數(shù)不同。友元運(yùn)算符函數(shù)的定義如下:type operator (參數(shù)表) / 運(yùn)算符處理程序代碼第9頁,共30頁,2022年,5月20日,19點(diǎn)43分,星期三【例6.3】用友員函數(shù)重載運(yùn)算符+#includeclass point private: float x,y; public: point(float xx=0, float yy=0)x=xx; y=yy; float get_x()return x; float get_y()return y; friend point operator +(point p1, point
8、p2);/重載運(yùn)算符“+” ;point operator +(point p1, point p2) return point(p1.x+p2.x, p1.y+p2.y); void main() point p1(3,3), p2(2,2), p3;/聲明point類的對(duì)象 p3=p1+p2;或operator +(p1,p2)/兩點(diǎn)相加 coutp1+p2:x=p3.get_x(),y=p3.get_y()endl;第10頁,共30頁,2022年,5月20日,19點(diǎn)43分,星期三6.1.4 幾個(gè)常用運(yùn)算符的重載2前自增和后自增運(yùn)算符+的重載前自增運(yùn)算符+和后自增運(yùn)算符+重載的語法oper
9、ator+(); /前operator+(int); /后課本P147【例6.7】用成員函數(shù)重載前自增和后自增運(yùn)算符?!纠?.8】用友元重載前自增和后自增 第11頁,共30頁,2022年,5月20日,19點(diǎn)43分,星期三6.2 虛函數(shù)6.2.1 為什么要引入虛函數(shù)6.2.2 虛函數(shù)的定義與使用第12頁,共30頁,2022年,5月20日,19點(diǎn)43分,星期三6.2.1 為什么要引入虛函數(shù) 指向基類對(duì)象的指針都可以指向它的公有派生類對(duì)象,但不能指向它的私有派生類對(duì)象。不能將一個(gè)聲明為指向派生類對(duì)象的指針指向其基類的一個(gè)對(duì)象。 聲明為指向基類對(duì)象的指針,當(dāng)它指向公有派生類對(duì)象時(shí),只能利用它來直接訪問
10、派生類中從基類繼承來的成員,不能直接訪問公有派生類中特定的成員。 若想訪問其公有派生類的特定成員,可以將基類指針顯式類型轉(zhuǎn)換為派生類指針來實(shí)現(xiàn)。 【例6.14】引入虛函數(shù)舉例第13頁,共30頁,2022年,5月20日,19點(diǎn)43分,星期三【例6.14】引入虛函數(shù)舉例#include class base public:void who()coutthis is the class of base!endl; ;class derive1:public base public:void who()coutthis is the class of derive1!endl; ;class deri
11、ve2:public base public:void who()coutthis is the class of derive2!who(); derive1 obj2; p=&obj3; derive2 obj3; p-who(); p=&obj1; (derive2 *)p)-who(); p-who(); obj2.who(); p=&obj2; obj3.who(); p-who(); 第14頁,共30頁,2022年,5月20日,19點(diǎn)43分,星期三6.2.2 虛函數(shù)的定義與使用 1虛函數(shù)的定義 虛函數(shù)定義是在基類中進(jìn)行的(virtual),虛函數(shù)提供了一種接口界面。在基類中的某個(gè)成
12、員函數(shù)被聲明為虛函數(shù)后,在派生類中重新定義虛函數(shù)時(shí),都必須與基類中的原型完全相同。 虛函數(shù)是一種非靜態(tài)的成員函數(shù),說明虛函數(shù)的方法如下: virtual 類型函數(shù)名(參數(shù)表)第15頁,共30頁,2022年,5月20日,19點(diǎn)43分,星期三2. 虛函數(shù)與重載函數(shù)的關(guān)系(1) 重載函數(shù)要求函數(shù)有相同的函數(shù)名稱,但是形參的個(gè)數(shù)或者類型不應(yīng)相同;而虛函數(shù)則要求函數(shù)名、返回值類型和參數(shù)完全相同;(2) 重載函數(shù)可以是成員函數(shù)或友員函數(shù),而虛函數(shù)只能是成員函數(shù);(3) 重載函數(shù)的調(diào)用是以所傳遞參數(shù)序列的差別作為調(diào)用不同函數(shù)的依據(jù);虛函數(shù)是根據(jù)對(duì)象的不同去調(diào)用不同類的虛函數(shù);(4) 虛函數(shù)在運(yùn)行時(shí)表現(xiàn)出多態(tài)
13、功能,這是C+的精髓;而重載函數(shù)則在編譯時(shí)表現(xiàn)出多態(tài)性。第16頁,共30頁,2022年,5月20日,19點(diǎn)43分,星期三【例6.15】虛函數(shù)與重載函數(shù)的關(guān)系 #include void main() class base base obj1,*ptr; public: derive obj2; virtual void f1() ptr=&obj1; coutf1 function of basef1(); virtual void f2() ptr-f2(); coutf2 function of basef3();virtual void f3() ptr=&obj2;coutf3 fun
14、ction of basef1();void f4() ptr-f2();coutf4 function of basef4(); class derive:public base void f1() / 仍為虛函數(shù)coutf1 function of derive!endl;void f2(int x) / 丟失虛特性coutf2 function of deriveendl;/int f3() 錯(cuò)誤,只有返回類型不同/coutf3 function of deriveendl;void f4()coutf4 function of deriveendl;第17頁,共30頁,2022年,5月
15、20日,19點(diǎn)43分,星期三3虛函數(shù)的使用 定義一個(gè)基類的對(duì)象指針或引用便可使其在需要時(shí)指向相應(yīng)的派生類對(duì)象,可以調(diào)用該對(duì)象所對(duì)應(yīng)的類中已被“虛擬化”的函數(shù),從而實(shí)現(xiàn)真正的運(yùn)行時(shí)的多態(tài)性?!纠?.16】虛函數(shù)的使用舉例。注意:在構(gòu)造函數(shù)中出現(xiàn)虛函數(shù),虛函數(shù)的調(diào)用采用靜態(tài)聯(lián)編,即它們所調(diào)用的虛函數(shù)是基類中定義的函數(shù)而不是在任何派生類中重定義的函數(shù)。第18頁,共30頁,2022年,5月20日,19點(diǎn)43分,星期三【例6.16】虛函數(shù)的使用舉例#include void main() class A A a; public: B b; A() A *p=&b; coutthe constructor
16、 of class Af(); f(); p-g(); virtual void f() p-h(); coutA:f()endl; a.f(); void g() a.g(); coutA:g()endl; a.h(); void h() b.f(); coutA:h()endl; b.g(); f(); g(); b.h(); class B: public A public: void f() coutB:f()endl; void g() coutB:g()endl;第19頁,共30頁,2022年,5月20日,19點(diǎn)43分,星期三4.在構(gòu)造函數(shù)和析構(gòu)函數(shù)中調(diào)用虛函數(shù) 編譯系統(tǒng)對(duì)構(gòu)造函數(shù)
17、和析構(gòu)函數(shù)中調(diào)用虛函數(shù)采用靜態(tài)聯(lián)編,即它們所調(diào)用的虛函數(shù)是自己的類或基類中定義的函數(shù)而不是在任何派生類中重定義的函數(shù)。 使用對(duì)象調(diào)用虛函數(shù)也采用靜態(tài)聯(lián)編。第20頁,共30頁,2022年,5月20日,19點(diǎn)43分,星期三【例6.18】在構(gòu)造函數(shù)中調(diào)用虛函數(shù)。#include class base public:base() coutconstruct baseendl; virtual void vf() coutbase:vf() calledendl;class son:public base public:son()vf(); void g()vf(); ;class grandson:p
18、ublic son public: grandson() coutconstruct grandsonendl; void vf() coutgrandson:vf() calledn;void main() grandson gs; gs.g(); 第21頁,共30頁,2022年,5月20日,19點(diǎn)43分,星期三 6.3 純虛函數(shù)和抽象類6.3.1 純虛函數(shù)的概念 純虛函數(shù)是一種沒有具體實(shí)現(xiàn)的特殊的虛函數(shù)。純虛函數(shù)的定義格式如下:virtual 類型(函數(shù)名)(參數(shù)表)=0; 第22頁,共30頁,2022年,5月20日,19點(diǎn)43分,星期三6.3.2 抽象類的概念 1抽象類和具體類的概念 如
19、果一個(gè)類至少有一個(gè)純虛函數(shù),那么就稱該類為抽象類。 抽象類的主要作用是為其所組織的繼承層次結(jié)構(gòu)提供一個(gè)公共的基類,其它類可以從它這里繼承和實(shí)現(xiàn)接口,純虛函數(shù)的實(shí)現(xiàn)由其具體的派生類來提供。第23頁,共30頁,2022年,5月20日,19點(diǎn)43分,星期三2對(duì)抽象類的規(guī)定(1) 抽象類只能作為基類來派生新類,不能建立抽象類的對(duì)象。(2) 可以聲明指向抽象類的指針和引用,此指針可以指向它的公有派生類,進(jìn)而實(shí)現(xiàn)多態(tài)性。第24頁,共30頁,2022年,5月20日,19點(diǎn)43分,星期三【例6.20】計(jì)算各類形狀的總面積#include float total(shape * s , int n) class
20、 shape / 抽象類的定義 public: float sum=0; virtual float area()=0; ; for(int i=0; iarea(); protected: return sum; float h, w; public: void main() triangle(float hh, float ww) h=hh; w=ww; shape *s4; float area() s0=new triangle(3,4); return h*w*0.5; ; s1=new rectangle(2,4); class rectangle: public triangle
21、 / 矩形類 s2=new circle(5); public: s3=new circle(8); rectangle(float h, float w):triangle(h, w) float sum=total(s,4); float area() coutsumendl; return h*w; ; class circle: public shape / 圓類 private: float radius; public:circle(float r) radius=r;float area() return radius*radius*3.14; ;第25頁,共30頁,2022年,
22、5月20日,19點(diǎn)43分,星期三6.4 虛析構(gòu)函數(shù) 如果一個(gè)基類的析構(gòu)函數(shù)被說明為虛函數(shù),則它的派生類的析構(gòu)函數(shù)無論是否使用virtual進(jìn)行說明,都自動(dòng)成為虛析構(gòu)函數(shù)。 虛析構(gòu)函數(shù)的聲明語法如下: virtual 類名【例6.21】虛析構(gòu)函數(shù)的使用第26頁,共30頁,2022年,5月20日,19點(diǎn)43分,星期三#include void main() #include class base base *px =new derive(5,7,base,derive); char *p; delete px; public: base(int sz, char *bptr) p = new char sz;strcpy( p,bptr);coutconstructor baseendl; virtual base() delete p; cout destructor basen; ;class derive: public base char *pp;public:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 危險(xiǎn)品管理對(duì)噪聲振動(dòng)和輻射的管理和控制要求考核試卷
- 服裝設(shè)計(jì)人體工學(xué)原理考核試卷
- 批發(fā)業(yè)采購談判技巧與策略考核試卷
- 機(jī)床功能部件在虛擬現(xiàn)實(shí)設(shè)備中的交互式設(shè)計(jì)考核試卷
- 有機(jī)肥料在土壤侵蝕控制與生態(tài)恢復(fù)中的應(yīng)用考核試卷
- 兒童情商培訓(xùn)課件
- 代加工合同范本簡單
- 燈具采購標(biāo)準(zhǔn)合同范本
- 簡易的物業(yè)合同范本
- 助學(xué)贈(zèng)與合同范本
- 私立醫(yī)療機(jī)構(gòu)2025年運(yùn)營策略與計(jì)劃
- 四川省眉山市眉山中學(xué)2024-2025學(xué)年高二上學(xué)期11月期中考試試題2
- 2025年蘇州農(nóng)業(yè)職業(yè)技術(shù)學(xué)院高職單招高職單招英語2016-2024歷年頻考點(diǎn)試題含答案解析
- 公共服務(wù)均等化研究-第2篇-深度研究
- 字體設(shè)計(jì)完整版本
- 【歷史】安史之亂與唐朝衰亡課件 2024-2025學(xué)年統(tǒng)編版七年級(jí)歷史下冊(cè)
- 短視頻居間代理合同范本
- 二零二五年度港口碼頭安全承包服務(wù)協(xié)議4篇
- 2024年蘇州衛(wèi)生職業(yè)技術(shù)學(xué)院高職單招語文歷年參考題庫含答案解析
- 《歡樂運(yùn)動(dòng)會(huì):1 我為班級(jí)出把力》說課稿-2024-2025學(xué)年四年級(jí)上冊(cè)綜合實(shí)踐活動(dòng)滬科黔科版
- 2024年汽車駕駛員(高級(jí))證考試題庫附答案
評(píng)論
0/150
提交評(píng)論