版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
關(guān)于多態(tài)性和虛函數(shù)第一頁(yè),共三十頁(yè),編輯于2023年,星期日多態(tài)性
不同的對(duì)象接收到相同的消息時(shí)產(chǎn)生多種完全不同的行為的現(xiàn)象稱為多態(tài)性。
C++支持兩種多態(tài)性:編譯時(shí)的多態(tài)性和運(yùn)行時(shí)多態(tài)性。編譯時(shí)的多態(tài)性使用重載來(lái)獲得,運(yùn)行時(shí)的多態(tài)性通過(guò)使用繼承和虛函數(shù)獲得。C++語(yǔ)言中,重載包括函數(shù)重載和運(yùn)算符重載。第二頁(yè),共三十頁(yè),編輯于2023年,星期日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)算符的重載第三頁(yè),共三十頁(yè),編輯于2023年,星期日6.1.1運(yùn)算符重載概述1.運(yùn)算符重載定義C++中預(yù)定義的運(yùn)算符的操作對(duì)象只能是基本數(shù)據(jù)類(lèi)型,運(yùn)算符重載是對(duì)運(yùn)算符進(jìn)行重新定義,賦予已有符號(hào)新功能的要求。不能重載的運(yùn)算符是:(1)成員訪問(wèn)運(yùn)算符.(2)作用域運(yùn)算符∷(3)條件運(yùn)算符?:(4)成員指針運(yùn)算符*(5)編譯預(yù)處理命令的開(kāi)始符號(hào)#第四頁(yè),共三十頁(yè),編輯于2023年,星期日2.運(yùn)算符重載的規(guī)則
⑴
C++中的運(yùn)算符除了少數(shù)幾個(gè)以外,幾乎全部可以重載,程序員不能定義新的運(yùn)算符,只能重載已有的這些運(yùn)算符。⑵重載之后運(yùn)算符的優(yōu)先級(jí)和結(jié)合性都不能改變。⑶運(yùn)算符重載是針對(duì)新類(lèi)型數(shù)據(jù)的實(shí)際需要,對(duì)原有運(yùn)算符進(jìn)行適當(dāng)?shù)母脑臁?.運(yùn)算符重載的形式運(yùn)算符重載可以使用成員函數(shù)和友元函數(shù)兩種形式。運(yùn)算符重載的實(shí)質(zhì)就是函數(shù)重載。第五頁(yè),共三十頁(yè),編輯于2023年,星期日6.1.2用成員函數(shù)重載運(yùn)算符
在類(lèi)定義體中聲明運(yùn)算符函數(shù)的形式為:typeoperator@(參數(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類(lèi)名::operator@(參數(shù)表){//運(yùn)算符處理程序代碼}重載運(yùn)算符的使用方法同原運(yùn)算符一樣,只是它的操作數(shù)一定要是定義它的特定類(lèi)的對(duì)象。第六頁(yè),共三十頁(yè),編輯于2023年,星期日【例6.1】用成員函數(shù)重載運(yùn)算符+#include<iostream.h>classpoint{private:floatx,y;public:point(floatxx=0,floatyy=0){x=xx;y=yy;}floatget_x(){returnx;}floatget_y(){returny;}pointoperator+(pointq); //重載運(yùn)算符“+”};pointpoint::operator+(pointq){returnpoint(x+q.x,y+q.y);}voidmain(){pointp1(3,3),p2(2,2),p3; //聲明point類(lèi)的對(duì)象
p3=p1+p2;或p1.operator+(p2) //兩點(diǎn)相加
cout<<"p1+p2:x="<<p3.get_x()<<",y="<<p3.get_y()<<endl;}第七頁(yè),共三十頁(yè),編輯于2023年,星期日【例6.2】用成員函數(shù)重載運(yùn)算符++#include<iostream.h>pointpoint::operator++()classpoint{{++x;private:++y; floatx,y;return*this;public:} point(floatxx=0,floatyy=0){x=xx;y=yy;} floatget_x(){returnx;} floatget_y(){returny;}pointoperator++(); //重載前置運(yùn)算符“++”};voidmain(){pointp1(10,10);
++p1;或cout<<"p1:x="<<p1.get_x()<<",y="<<p1.get_y()<<endl;}第八頁(yè),共三十頁(yè),編輯于2023年,星期日6.1.3用友元函數(shù)重載運(yùn)算符friendtypeoperator@(參數(shù)表);注意友元函數(shù)不屬于任何類(lèi),它沒(méi)有this指針,這與成員函數(shù)完全不同。若運(yùn)算符是一元的,則參數(shù)表中有一個(gè)操作數(shù);若運(yùn)算符是二元的,則參數(shù)表中有兩個(gè)操作數(shù)。友元運(yùn)算符函數(shù)與成員運(yùn)算符函數(shù)的主要區(qū)別在其參數(shù)個(gè)數(shù)不同。友元運(yùn)算符函數(shù)的定義如下:typeoperator@
(參數(shù)表){//運(yùn)算符處理程序代碼}第九頁(yè),共三十頁(yè),編輯于2023年,星期日【例6.3】用友員函數(shù)重載運(yùn)算符+#include<iostream.h>classpoint{private:floatx,y;public:point(floatxx=0,floatyy=0){x=xx;y=yy;}floatget_x(){returnx;}floatget_y(){returny;}friendpointoperator+(pointp1,pointp2); //重載運(yùn)算符“+”};pointoperator+(pointp1,pointp2){returnpoint(p1.x+p2.x,p1.y+p2.y);}voidmain(){pointp1(3,3),p2(2,2),p3; //聲明point類(lèi)的對(duì)象
p3=p1+p2;或operator+(p1,p2)
//兩點(diǎn)相加
cout<<"p1+p2:x="<<p3.get_x()<<",y="<<p3.get_y()<<endl;}第十頁(yè),共三十頁(yè),編輯于2023年,星期日6.1.4幾個(gè)常用運(yùn)算符的重載2.前自增和后自增運(yùn)算符++的重載前自增運(yùn)算符++和后自增運(yùn)算符++重載的語(yǔ)法<函數(shù)類(lèi)型>operator++();//前<函數(shù)類(lèi)型>operator++(int);//后課本P147【例6.7】用成員函數(shù)重載前自增和后自增運(yùn)算符?!纠?.8】用友元重載前自增和后自增
第十一頁(yè),共三十頁(yè),編輯于2023年,星期日6.2虛函數(shù)
6.2.1為什么要引入虛函數(shù)6.2.2虛函數(shù)的定義與使用第十二頁(yè),共三十頁(yè),編輯于2023年,星期日6.2.1為什么要引入虛函數(shù)指向基類(lèi)對(duì)象的指針都可以指向它的公有派生類(lèi)對(duì)象,但不能指向它的私有派生類(lèi)對(duì)象。不能將一個(gè)聲明為指向派生類(lèi)對(duì)象的指針指向其基類(lèi)的一個(gè)對(duì)象。聲明為指向基類(lèi)對(duì)象的指針,當(dāng)它指向公有派生類(lèi)對(duì)象時(shí),只能利用它來(lái)直接訪問(wèn)派生類(lèi)中從基類(lèi)繼承來(lái)的成員,不能直接訪問(wèn)公有派生類(lèi)中特定的成員。若想訪問(wèn)其公有派生類(lèi)的特定成員,可以將基類(lèi)指針顯式類(lèi)型轉(zhuǎn)換為派生類(lèi)指針來(lái)實(shí)現(xiàn)。
【例6.14】引入虛函數(shù)舉例第十三頁(yè),共三十頁(yè),編輯于2023年,星期日【例6.14】引入虛函數(shù)舉例#include<iostream.h>classbase{public: voidwho() {cout<<"thisistheclassofbase!"<<endl;}};classderive1:publicbase{public: voidwho() {cout<<"thisistheclassofderive1!"<<endl;}};classderive2:publicbase{public: voidwho() {cout<<"thisistheclassofderive2!"<<endl;}};voidmain(){baseobj1,*p;((derive1*)p)->who();derive1obj2;p=&obj3;derive2obj3;p->who();p=&obj1;((derive2*)p)->who();p->who();obj2.who();p=&obj2;obj3.who();p->who();}第十四頁(yè),共三十頁(yè),編輯于2023年,星期日6.2.2虛函數(shù)的定義與使用1.虛函數(shù)的定義虛函數(shù)定義是在基類(lèi)中進(jìn)行的(virtual),虛函數(shù)提供了一種接口界面。在基類(lèi)中的某個(gè)成員函數(shù)被聲明為虛函數(shù)后,在派生類(lèi)中重新定義虛函數(shù)時(shí),都必須與基類(lèi)中的原型完全相同。虛函數(shù)是一種非靜態(tài)的成員函數(shù),說(shuō)明虛函數(shù)的方法如下:
virtual〈類(lèi)型〉〈函數(shù)名〉(〈參數(shù)表〉)第十五頁(yè),共三十頁(yè),編輯于2023年,星期日2.虛函數(shù)與重載函數(shù)的關(guān)系
(1)重載函數(shù)要求函數(shù)有相同的函數(shù)名稱,但是形參的個(gè)數(shù)或者類(lèi)型不應(yīng)相同;而虛函數(shù)則要求函數(shù)名、返回值類(lèi)型和參數(shù)完全相同;(2)重載函數(shù)可以是成員函數(shù)或友員函數(shù),而虛函數(shù)只能是成員函數(shù);(3)重載函數(shù)的調(diào)用是以所傳遞參數(shù)序列的差別作為調(diào)用不同函數(shù)的依據(jù);虛函數(shù)是根據(jù)對(duì)象的不同去調(diào)用不同類(lèi)的虛函數(shù);(4)虛函數(shù)在運(yùn)行時(shí)表現(xiàn)出多態(tài)功能,這是C++的精髓;而重載函數(shù)則在編譯時(shí)表現(xiàn)出多態(tài)性。第十六頁(yè),共三十頁(yè),編輯于2023年,星期日【例6.15】虛函數(shù)與重載函數(shù)的關(guān)系
#include<iostream.h>voidmain()classbase{{baseobj1,*ptr;public:deriveobj2; virtualvoidf1()ptr=&obj1; {cout<<"f1functionofbase"<<endl;}ptr->f1(); virtualvoidf2()ptr->f2(); {cout<<"f2functionofbase"<<endl;}ptr->f3(); virtualvoidf3()ptr=&obj2; {cout<<"f3functionofbase"<<endl;}ptr->f1(); voidf4()ptr->f2(); {cout<<"f4functionofbase"<<endl;}ptr->f4();};}classderive:publicbase{voidf1()//仍為虛函數(shù)
{cout<<"f1functionofderive!"<<endl;} voidf2(intx)//丟失虛特性
{cout<<"f2functionofderive"<<endl;}// intf3()錯(cuò)誤,只有返回類(lèi)型不同// {cout<<"f3functionofderive"<<endl;} voidf4()
{cout<<"f4functionofderive"<<endl;}};第十七頁(yè),共三十頁(yè),編輯于2023年,星期日3.虛函數(shù)的使用
定義一個(gè)基類(lèi)的對(duì)象指針或引用便可使其在需要時(shí)指向相應(yīng)的派生類(lèi)對(duì)象,可以調(diào)用該對(duì)象所對(duì)應(yīng)的類(lèi)中已被“虛擬化”的函數(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ù)是基類(lèi)中定義的函數(shù)而不是在任何派生類(lèi)中重定義的函數(shù)。第十八頁(yè),共三十頁(yè),編輯于2023年,星期日【例6.16】虛函數(shù)的使用舉例#include<iostream.h>voidmain()classA{{Aa;public:Bb;A()A*p=&b;{ cout<<"theconstructorofclassA"<<endl;p->f(); f();}p->g();virtualvoidf()p->h();{cout<<"A::f()"<<endl;}a.f();voidg()a.g();{cout<<"A::g()"<<endl;}a.h();voidh()b.f();{cout<<"A::h()"<<endl;b.g(); f();g();}b.h();};}classB:publicA{public:voidf(){cout<<"B::f()"<<endl;}voidg(){cout<<"B::g()"<<endl;}};第十九頁(yè),共三十頁(yè),編輯于2023年,星期日4.在構(gòu)造函數(shù)和析構(gòu)函數(shù)中調(diào)用虛函數(shù)
編譯系統(tǒng)對(duì)構(gòu)造函數(shù)和析構(gòu)函數(shù)中調(diào)用虛函數(shù)采用靜態(tài)聯(lián)編,即它們所調(diào)用的虛函數(shù)是自己的類(lèi)或基類(lèi)中定義的函數(shù)而不是在任何派生類(lèi)中重定義的函數(shù)。
使用對(duì)象調(diào)用虛函數(shù)也采用靜態(tài)聯(lián)編。第二十頁(yè),共三十頁(yè),編輯于2023年,星期日【例6.18】在構(gòu)造函數(shù)中調(diào)用虛函數(shù)。#include<iostream.h>classbase{public: base(){cout<<"constructbase"<<endl;} virtualvoidvf() {cout<<"base::vf()called"<<endl;}};classson:publicbase{public: son(){vf();} voidg(){vf();}};classgrandson:publicson{public: grandson(){cout<<"constructgrandson"<<endl;} voidvf() {cout<<"grandson:vf()called\n";}};voidmain(){grandsongs;gs.g();}第二十一頁(yè),共三十頁(yè),編輯于2023年,星期日
6.3純虛函數(shù)和抽象類(lèi)
6.3.1純虛函數(shù)的概念純虛函數(shù)是一種沒(méi)有具體實(shí)現(xiàn)的特殊的虛函數(shù)。純虛函數(shù)的定義格式如下:virtual〈類(lèi)型〉(函數(shù)名)((參數(shù)表))=0;
第二十二頁(yè),共三十頁(yè),編輯于2023年,星期日6.3.2抽象類(lèi)的概念
1.抽象類(lèi)和具體類(lèi)的概念如果一個(gè)類(lèi)至少有一個(gè)純虛函數(shù),那么就稱該類(lèi)為抽象類(lèi)。抽象類(lèi)的主要作用是為其所組織的繼承層次結(jié)構(gòu)提供一個(gè)公共的基類(lèi),其它類(lèi)可以從它這里繼承和實(shí)現(xiàn)接口,純虛函數(shù)的實(shí)現(xiàn)由其具體的派生類(lèi)來(lái)提供。第二十三頁(yè),共三十頁(yè),編輯于2023年,星期日2.對(duì)抽象類(lèi)的規(guī)定
(1)抽象類(lèi)只能作為基類(lèi)來(lái)派生新類(lèi),不能建立抽象類(lèi)的對(duì)象。(2)可以聲明指向抽象類(lèi)的指針和引用,此指針可以指向它的公有派生類(lèi),進(jìn)而實(shí)現(xiàn)多態(tài)性。第二十四頁(yè),共三十頁(yè),編輯于2023年,星期日【例6.20】計(jì)算各類(lèi)形狀的總面積#include<iostream.h>floattotal(shape*s[],intn)classshape//抽象類(lèi)的定義{{public:floatsum=0; virtualfloatarea()=0;};for(inti=0;i<n;i++)classtriangle:publicshape//三角形類(lèi)sum+=s[i]->area();{protected:returnsum; floath,w;}public:voidmain() triangle(floathh,floatww){ {h=hh;w=ww;}shape*s[4]; floatarea()s[0]=newtriangle(3,4); {returnh*w*0.5;}};s[1]=newrectangle(2,4);classrectangle:publictriangle//矩形類(lèi)s[2]=newcircle(5);{public:s[3]=newcircle(8); rectangle(floath,floatw):triangle(h,w){}floatsum=total(s,4); floatarea()cout<<sum<<endl; {returnh*w;}};}classcircle:publicshape//圓類(lèi){private: floatradius;public: circle(floatr){radius=r;} floatarea() {returnradius*radius*3.14;}};第二十五頁(yè),共三十頁(yè),編輯于2023年,星期日6.4虛析構(gòu)函數(shù)如果一個(gè)基類(lèi)的析構(gòu)函數(shù)被說(shuō)明為虛函數(shù),則它的派生類(lèi)的析構(gòu)函數(shù)無(wú)論是否使用virtual進(jìn)行說(shuō)明,都自動(dòng)成為虛析構(gòu)函數(shù)。
虛析構(gòu)函數(shù)的聲明語(yǔ)法如下:virtual~類(lèi)名【例6.21】虛析構(gòu)函數(shù)的使用第二十六頁(yè),共三十頁(yè),編輯于2023年,星期日#include<iostream.h>voidmain()
#include<string.h>{classbasebase*px=newderive(5,7,"base","derive");{char*p;deletepx;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年山東淄博市高青縣公開(kāi)招聘基層動(dòng)物防疫員55人管理單位筆試遴選500模擬題附帶答案詳解
- 2025年山東淄博周村區(qū)文昌湖省級(jí)旅游度假區(qū)“服務(wù)基層人才專項(xiàng)”招募217人管理單位筆試遴選500模擬題附帶答案詳解
- 2025年山東濟(jì)南濟(jì)北經(jīng)濟(jì)開(kāi)發(fā)區(qū)招聘人員管理單位筆試遴選500模擬題附帶答案詳解
- 2025年山東泰安新泰市鄉(xiāng)村公益性崗位招聘2800人歷年管理單位筆試遴選500模擬題附帶答案詳解
- 2025年山東棗莊滕州市事業(yè)單位招聘工作人員62人歷年管理單位筆試遴選500模擬題附帶答案詳解
- 2025年山東日照鹽糧集團(tuán)限公司公開(kāi)招聘工作人員9人管理單位筆試遴選500模擬題附帶答案詳解
- 2025年山東日照市市屬事業(yè)單位招聘工作人員60人歷年管理單位筆試遴選500模擬題附帶答案詳解
- 2025年山東廣饒招聘事業(yè)單位工作人員及中小學(xué)教師歷年管理單位筆試遴選500模擬題附帶答案詳解
- 2025年山東威海市文登區(qū)衛(wèi)生健康局所屬事業(yè)單位招聘28人歷年管理單位筆試遴選500模擬題附帶答案詳解
- 2025年山東臨沂市郯城縣征集普通高等院校本科畢業(yè)生入伍12人管理單位筆試遴選500模擬題附帶答案詳解
- 2024北京西城初一(上)期末數(shù)學(xué)(教師版)
- 北京市朝陽(yáng)區(qū)2023-2024學(xué)年四年級(jí)上學(xué)期期末英語(yǔ)試題
- 追求“真實(shí)、樸實(shí)、扎實(shí)”的語(yǔ)文課堂
- 工業(yè)機(jī)器人論文
- UC2845的應(yīng)用和PWM變壓器設(shè)計(jì)
- 螺桿空壓機(jī)操作規(guī)程完整
- 圓柱螺旋扭轉(zhuǎn)彈簧計(jì)算公式EXCEL計(jì)算
- 中南大學(xué) 信號(hào)與系統(tǒng)實(shí)驗(yàn)報(bào)告
- 在建鋼結(jié)構(gòu)工程危險(xiǎn)源辨識(shí)評(píng)價(jià).doc
- 異常子宮出血病因與治療的臨床分析
- 少數(shù)民族預(yù)科學(xué)生思想政治教育研究
評(píng)論
0/150
提交評(píng)論