class第三章類間數(shù)據(jù)與函數(shù)_第1頁
class第三章類間數(shù)據(jù)與函數(shù)_第2頁
class第三章類間數(shù)據(jù)與函數(shù)_第3頁
class第三章類間數(shù)據(jù)與函數(shù)_第4頁
class第三章類間數(shù)據(jù)與函數(shù)_第5頁
已閱讀5頁,還剩29頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第三章類間數(shù)據(jù)與函數(shù)類與類之間的關(guān)系可以分為:組合、、繼承以及嵌套關(guān)系。從某種意義上講,類相當(dāng)于一種自定義的數(shù)據(jù)類型,當(dāng)一個新的類中申明該數(shù)據(jù)類型時,即為類的組合關(guān)系;和函數(shù)類似,在一個新的類中申明一個已經(jīng)存在的類為,即為該類的類,類與函數(shù)有相似的特征;當(dāng)一個類具有已存在的類某些特征時,同時賦予給類一些新的特征,此即為類的繼承關(guān)系。繼承是面向?qū)ο笾匾卣鳌T谝粋€新的類內(nèi)部可以包含一個新申明的類,該類依賴外部類而存在,這種類關(guān)系稱之為嵌套。第一節(jié)類的組合第二節(jié)類第三節(jié)類的繼承第四節(jié)第五節(jié)第六節(jié)純虛函數(shù)與抽象類 第八節(jié)第九節(jié)第一節(jié)類的組合 例程3-usingnamespaceusingnamespaceclassDate(intYear=1973,intMonth=1,int}void}int}intclassStudent(stringName,Date}conststringreturnthis-}Datereturnthis-}stringDateBirthDay;//Student組合進(jìn)DateintDateintDateStudentreturn}例程3-usingusingnamespaceclassNode(longthis->pHead=newint[this-}int*getAddrHead()const{//獲得Nodereturn}int*getAddrHead()const{//獲得Nodereturnthis-}voidsetAddrNext(Node*ptr){//設(shè)置pNext}longreturnthis-}longint*pHead;//NodeNode*pNext;//structArray(intthis->firstNode=newNode(this-}Node*return}Node*returnthis-}voidNode*newNodeAddr=newNode(this-}longunitSize;//Node*firstNode;//Node*lastNode;//intArrayint*p=myArr.getHead()-intsize=myArr.getHead()-for(int}return 第二 例程3-usingnamespaceusingnamespaceclassstd::cout<<"NowIn}Teacher(stringName,stringfriendclassstringstringstringstringclassStudent(stringName,stringDescription,int}voidsetTeacher(constTeacher}voiddis}TeacherstringstringintintStudentMe("John","HeintStudentMe("John","HeisgoodTeacherMr("Tom","Heisgood return} 第三節(jié)類的繼承植物被分類為門、綱、目、科、屬、種,每個子類都具有父類的特征,但同時具有一些新的特征,子類還可以繼續(xù)分為子類。在人類社會,人具有一些共同特征,同時不同人群還具有特有的特征。這些關(guān)系,就是繼承關(guān)系。父類還可以稱為基類,子類還可以稱為派生類。類的繼承關(guān)系,是面向?qū)ο篌w系中最為重要的關(guān)系。如例程3-4所示。例程3-usingnamespaceusingnamespaceclassclass(stringID,stringName,boolvoid}stringID;//號stringbool;//,男為1,女為classStudent:public Student(intGrade,stringName,stringStudent(intGrade,stringName,stringID,bool):(ID,Name,}void}intGrade;//classTeacher:publicTeacher(stringofficeNo,stringTitle,stringName,stringID,bool):(ID,Name,}void}}stringofficeNo;//編stringintTeacherStudentreturn} 第四節(jié)多重繼承與虛基類usingnamespaceusingnamespaceclassA(inta=1):valA(a){cout<<"InA's~A(){cout<<"InAB'svoidprint(){cout<<"PrintingInA'sintclassB(intb=1):valB(b){cout<<"InB's~B(){cout<<"InB'svoidprint(){cout<<"PrintingInB'sintclassAB:publicB,public例程3-AB(intab=1):valAB(ab){cout<<"InAB'sAB(intab=1):valAB(ab){cout<<"InAB's~AB(){cout<<"InAB'svoidcout<<"PrintingInAB's}intintABreturn}例程3-classclassZ(inta=1):valZ(a){cout<<"InZ's~Z(){cout<<"InZ'svoidprint(){cout<<"PrintingInZ'sintclassA:virtualpublicA(inta=1):valA(a){cout<<"InA's~A(){cout<<"InAB'svoidprint(){cout<<"PrintingInA'sintclassB:virtualpublicB(intb=1):valB(b){cout<<"InB's~B(){cout<<"InB'svoidprint(){cout<<"PrintingInB'sintclassintclassAB:publicB,publicAB(intab=1):valAB(ab){cout<<"InAB's~AB(){cout<<"InAB'svoidcout<<"PrintingInAB's}intintABreturn}圖3-1虛擬(右)與非虛擬(左)繼承關(guān)系第五節(jié)虛函數(shù) 義形式為voiddis y(Shape*pShape)。在運行過程中,會自動根據(jù)運行場景,或選擇Circle的dis 虛函數(shù)。如將函數(shù)定義形式修改為voiddis y(Shape&pShape),則需 例程3-usingnamespaceconstusingnamespaceconstdouble

classclassvirtualvoiddiscout<<"Thisisa}classCircle:publicShape{//Circle(intvoiddiscout<<"Iamacircle!!!Area="<<this-}intRadius;//classRectangle:publicShape{//Rectangle(intW=1,intvoiddiscout<<"IamaRectangle!!!Area="<<this->width*this-}intwidth,height;//voidintwidth,height;//voiddisy(Shape}intRectangleCirclereturn}用一個函數(shù)應(yīng)對多個應(yīng)用,是多態(tài)性體現(xiàn)。voiddisy(Shape*pShape)或voiddisy(Shape&pShape)的參數(shù)有確定類型,但由于Shape類是Circle和Rectangle的基類,且申明為虛函數(shù),由此實現(xiàn)對象的動態(tài)綁定。虛函數(shù)經(jīng)過派生之后,在其派生類中就可以實現(xiàn)運行過程中的動態(tài)。另外,虛函數(shù)必須申明為非靜態(tài)的成員函數(shù)。第六節(jié)純虛函數(shù)與抽象類比較例程3-8和例程3-7可以發(fā)現(xiàn),僅shape類中的dis y()函數(shù)發(fā)生變化,其他代碼維持不變。例程3-8中,dis y()沒有代碼實現(xiàn),其函數(shù)名稱后增加了“=0”,表明其為純虛函數(shù),含有純虛函數(shù)的類稱之為抽象類。抽象類不能單獨存在,依賴于派生類而實例化,即不能單獨申明抽象類的對象。usingnamespaceusingnamespaceconstdouble classvirtualvoid classCircle:publicShape{//Circle(intvoid cout<<"Iamacircle!!!Area="<<this-}intRadius;//classRectangle:publicShape{//Rectangle(intW=1,intvoid cout<<"IamaRectangle!!!Area="<<this->width*this-cout<<"IamaRectangle!!!Area="<<this->width*this-}intwidth,height;//voiddisy(Shape}intRectangleCirclereturn}第七 控 45行所示;當(dāng)以protected繼承基類時,public成員被降格為protected,protected不發(fā)生變化,private已不能再降,此時派生類的對象不能 基類所有成員;當(dāng)以private繼承基類時,public和protected都降格為private成員,private維持不變,此時派生類的對象不能 例程3-usingnamespaceusingnamespaceclassABC(inta=1,intb=2,intintintintclassX:publicvoid}class}classY:protectedvoid}classZ:privatevoid}classfromZ:publicZ{//ZprivateclassfromZ:publicZ{//Zprivatefromvoid}intABCXx;//X以public方式繼承 YYZz;//Z以private方式繼承fromZreturn} 第八節(jié)類的嵌套類的嵌套是在類的內(nèi)部申明一個新類,該類僅在外部類的內(nèi)部存在,如例程3-10所示。被嵌套類被封裝在外部類中,不能單獨存在。如果一個類僅能在某個類的內(nèi)部存在,采用嵌套類是不錯的選擇。例程3-usingnamespaceclassusingnamespaceclassList(intthis->pDataHead=newNode(this-}classNode(intcout<<"IaminNodethis->pNode=newint[this-}intreturnthis-}voidreturnthis-}voidprint()const;//intintintintNodevoid}intListreturn}在第20行voidprint()const申明print()函數(shù)的原型,其實現(xiàn)在第30-32行實現(xiàn),注意其print()前作用域運算符的使用第九節(jié)類關(guān)系中的函數(shù)類可以集成數(shù)據(jù)成員和函數(shù)成員。一個類只有被實例化后,其內(nèi)部的函數(shù)和數(shù)據(jù)才能被應(yīng)用。在不同的類關(guān)系中,不同類型的函數(shù),有較為復(fù)雜的關(guān)系。在例程3-11中,類與類之間有多種關(guān)系。在類A中,申明類B是類A的 類。當(dāng)申明Aa時(第49行),可以發(fā)現(xiàn)類A的a對象執(zhí)行實例化時,類B并沒有被實例化。在類A中申明B是其 類,但A并不包含B的數(shù)據(jù)。相反,當(dāng)在實例化類B的b對象時(第53行),由于B類中有申明類A的實例a對象,因此首先實例化A類(A類的構(gòu)造函數(shù)被執(zhí)行),然后執(zhí)行B類的構(gòu)造函數(shù)。類Y繼承自類C,當(dāng)實例化類Y為y對象時(第51行),首先基類被實例化(執(zhí)行C的構(gòu)造函數(shù)),然后才是派生類被實例化(執(zhí)行Y的構(gòu)造函數(shù))。類B除了組合A類外,還嵌套類D,當(dāng)39行被注釋時,類D雖然在類X申明原型,但未使用,此時不會執(zhí)行類D的構(gòu)造函數(shù),知道第30行doSome()函數(shù)被執(zhí)行時,類D才會被實例化。如果第39行未被注釋,則優(yōu)先實例化類D,然后示例化類X。析構(gòu)函數(shù)嚴(yán)格按照構(gòu)造函數(shù)相反次序執(zhí)行,因為要考慮潛在的相關(guān)性。另外,構(gòu)造函數(shù)調(diào)用次序完全不受構(gòu)造函數(shù)的初始化表達(dá)式的次序影響,該次序是以后成員在類中的申明次序所決定。例程3-usingnamespaceusingnamespaceclassA(){cout<<"IaminA's~A(){cout<<"IaminA'svoidprint(){cout<<"PrintingInClassfriendclassclassB(){cout<<"IclassB(){cout<<"IaminB's~B(){cout<<"IaminB'svoidprint(){cout<<"PrintingInClassvoidexecAprint(){this-AclassC(){cout<<"IaminC's~C(){cout<<"IaminC'svoidprint(){cout<<"PrintingInClassclassX(){cout<<"IaminC's~X(){cout<<"IaminC'svoidprint(){cout<<"PrintingInClassvoiddoSome(){DAa;//classAa;//classD(){cout<<"IaminD's~D(){cout<<"IaminD'svo

溫馨提示

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

評論

0/150

提交評論