c計(jì)算機(jī)基礎(chǔ)教學(xué)研究室_第1頁(yè)
c計(jì)算機(jī)基礎(chǔ)教學(xué)研究室_第2頁(yè)
c計(jì)算機(jī)基礎(chǔ)教學(xué)研究室_第3頁(yè)
c計(jì)算機(jī)基礎(chǔ)教學(xué)研究室_第4頁(yè)
c計(jì)算機(jī)基礎(chǔ)教學(xué)研究室_第5頁(yè)
已閱讀5頁(yè),還剩40頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

計(jì)算機(jī)基礎(chǔ)教學(xué)研究主要內(nèi)派生類成多重繼繼承與組繼面向?qū)ο蟪绦蛟O(shè)計(jì)有4個(gè)主要特點(diǎn)抽象、封裝、要較好地進(jìn)行面向?qū)ο蟪绦蛟O(shè)計(jì),還必須了解面向?qū)ο蟪绦蛟O(shè)計(jì)另外兩個(gè)重要特征——繼承性和多態(tài)性。在本章中主要介紹有關(guān)繼承的知識(shí),在第12章中將介紹多態(tài)性。面向?qū)ο蠹夹g(shù)強(qiáng)調(diào)軟件的可重用性(softwarereusability)。C++語(yǔ)言提供了類的繼承機(jī)制,解繼承與派生的概

基類(父類計(jì)算機(jī)系人教職教職學(xué)教行政管教行政管理人教本科研究系主系主(子類(子類基類與派生類的對(duì)應(yīng)關(guān)單繼多繼多重派多層派一個(gè)新類從已有的類那里獲得其已有特性,這種現(xiàn)象稱為類的繼承。通過繼承,一個(gè)新建子類從已有的父類那里獲得父類的特性。(遺傳)從另一角度說,從已有的類(父類)子類,稱為類的派生類的繼承是用已有的類來建立專用類的編程技術(shù)。派生類繼承了基類的所有數(shù)據(jù)成員和成員函數(shù),并可以對(duì)成員作必要的增加或調(diào)整。一個(gè)基類可以派生出多個(gè)派生類,每一個(gè)派生類又可以作為基類再派生出新的派生類,因此基類和派生類是相對(duì)而言的。(singleinheritance),這種繼承關(guān)系所形成的層次派生類的聲明方class派生類名:繼承方式基類{派生類新增加的}假設(shè)已經(jīng)聲明了一個(gè)基類Studnt,在此基礎(chǔ)上通過單繼承建立一個(gè)派生類Studnt1:classStudent1:publicStudent//聲明基類是voiddisplay_1 //新增加的成員函{cout<<″age:″<<age<<endl;cout<<″address:″<<addr<<endl;}int //新增加的數(shù)string //新增加的數(shù)據(jù)成繼承方三種繼承方不同繼承方式的影響主要體現(xiàn)在1、派生類成員對(duì)基類成員的訪問控制2、派生類對(duì)象對(duì)基類成員的訪問控制private(私有的)派生類的構(gòu)實(shí)際上,并不是把基類的成員和派生類自己增加的成員簡(jiǎn)單地加在一起就成為派生類。構(gòu)造一個(gè)派生類包括以下3部分工作:(1)從基類接收成員。派生類把基類全部的成員(不包括構(gòu)造函數(shù)和析構(gòu)函數(shù))接收過來,也就是說是沒有選擇的,不能選擇接收其中一部分成員,而舍棄另一部分成員。要求我們根據(jù)派生類的需要慎重選擇基類,使冗余量最小*(2)調(diào)整從基類接收的成員。接收基類成員是程序人員不能*(3)在聲明派生類時(shí)增加的成員。這部分內(nèi)容是很重要的,它體現(xiàn)了派生類對(duì)基類功能的擴(kuò)展。要根據(jù)需要仔細(xì)考慮應(yīng)當(dāng)增加哪些成員,精心設(shè)計(jì)。此外,在聲明派生類時(shí),一般還應(yīng)當(dāng)自己定義派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù),因?yàn)闃?gòu)造函數(shù)和析構(gòu)函數(shù)是不能從基類繼承的。派生類成員的訪問屬公有繼承基類的pulic和protected成員的訪問屬性在派生類中保持不變,但基類的private成員不可訪問。派生類中的成員函數(shù)可以直接訪問基類中的public通過派生類的對(duì)象只能訪問基類的public派派生類對(duì)象(類外定義基基私有成}

派生私有成}有繼承舉class //基類Point類的聲 Point(floatxfloatvoidMove(floatxOff,floatfloatGetX(){returnX;}floatGetY(){returnprivate:私有數(shù)據(jù)成員floatX,Y;classRectanglepublicPoint//{ //新增公有函數(shù)成Rectangle(floatx,floaty,floatw,floatfloatGetH(){returnH;}floatGetW(){returnW;}private://新增私有數(shù)據(jù)成floatint Rectanglerect(2,3,20,10); return0;}運(yùn)行結(jié)果派生類成員的訪問屬私有繼承派生類中的成員函數(shù)可以直接訪問基類中的publicprotected成員,但不能訪問基類的private通過派生類的對(duì)象不能訪問基類中的任何成員,基類原有的外部接口被派生類封裝和隱蔽起來。派派生類對(duì)象(類外定義基基私有成}派生私有成}圖對(duì)于不需要再往下繼承的類的功能可以用私有繼承方式把它隱蔽起來,這樣,下一層的派生類無法訪問它的任何成員。例:私有繼承舉classRectangleprivate //派生類聲 //新增外部接Rectangle(floatx,floaty,floatw,float voidMove(floatxOff,floatyOff)floatGetX(){returnPoint::GetX();}floatGetY(){returnPoint::GetY();}floatGetH(){returnH;}floatGetW(){returnW;}private://新增私有數(shù)floatint Rectanglerect(2,3,20,10);return0;}派生類成員的訪問屬保護(hù)繼承*保護(hù)成員的意思是不能被外界引用,但可以被派生派生類中的成員函數(shù)可以直接訪問基類中的publicprotected成員,但不能訪問基類的private通過派生類基基}}派生類對(duì)象(類外定義類中引用保護(hù)成員class //基類Point類的聲 //公有函數(shù)成Point(floatx=0,floatvoidMove(floatxOff,floatfloatGetX(){returnX;}floatGetY(){return 保護(hù)數(shù)據(jù)floatclassRectangleprotected //派生類 //新增外部接Rectangle(floatx,floaty,floatw,float //訪問基類公有成voidMove(floatxOff,floatyOff){Point::Move(xOff,yOff);}floatGetX(){returnPoint::GetX();}floatGetY(){returnPoint::GetY();}floatGetH(){returnH;}floatGetW(){returnW;} float在派生類中引用保護(hù)成int Rectanglerect(2,3,20,10);return0;}訪問權(quán)限概public,private和protected是三種常用的繼承方式,繼承方式的同決定了派生類對(duì)基類成員的派生類的繼基

說如果需要在派生類中引用基類的某些成員,應(yīng)當(dāng)將基類的這些成員聲明為protetd,而不要聲明為private。如果善于利用保護(hù)成員,可以在類的層次結(jié)構(gòu)中找到數(shù)據(jù)共享與成員隱蔽之間的結(jié)合點(diǎn)。既可實(shí)現(xiàn)某些成員的隱蔽,又可方便地繼承,能實(shí)現(xiàn)代碼重用與擴(kuò)充。#include<iostream.h>classAvoidA(intj1;

classC:publicvoidf3();C()intj3;int

f2()能否訪問能訪問f1()、j1,不能訪問 b能否訪問能訪問f1(),不能訪問i1和 f3()能否訪問f2()、i2和以及f1(),j1和int classB:publicvoidf2();B()intj2;int

void{ABC}

f3能訪問f2()和j2,以及f1()j1,但不能訪問i1和例11.4多級(jí)派生的訪問屬性 //基inti;voidf2();intj;intk;classBpublic //public方voidf3();voidf4();intm;classCprotected //protected方voidf5();intn;派生類的構(gòu)造函數(shù)和析構(gòu)函*用戶在聲明類時(shí)可以不定義構(gòu)造函數(shù),系統(tǒng)會(huì)自動(dòng)設(shè)置一個(gè)默認(rèn)的構(gòu)造函數(shù),在定義類對(duì)象時(shí)會(huì)自動(dòng)調(diào)用這個(gè)默認(rèn)的構(gòu)造函數(shù)。這個(gè)構(gòu)造函數(shù)實(shí)際上是一個(gè)空函數(shù),不執(zhí)行任何操作。如果需要對(duì)類中的數(shù)據(jù)成員初始化,應(yīng)自己定義構(gòu)造函數(shù)。構(gòu)造函數(shù)的主要作用是對(duì)數(shù)據(jù)成員初始化。在設(shè)計(jì)派生類的構(gòu)造函數(shù)時(shí),不僅要考慮派生類所增加的數(shù)據(jù)成員的初始化,還應(yīng)當(dāng)考慮基類的數(shù)據(jù)成員初始化。也就是說,希望在執(zhí)行派生類的構(gòu)造函數(shù)時(shí),使派生類的數(shù)據(jù)成員和基類的數(shù)據(jù)成員同時(shí)都被初始化。解決這個(gè)問題的思路是:在執(zhí)行派生類的構(gòu)造函數(shù)時(shí)簡(jiǎn)單的派生類的構(gòu)造函任何派生類都包含基類的成員,簡(jiǎn)單的派生類只有一個(gè)基類,而且只有一級(jí)派生。例11.5簡(jiǎn)單的派生類的構(gòu)造函#include<iostream>usingnamespacestd;class //聲明基類Student(intn,stringnam,char //基類構(gòu)造函sex=s;}~Student(){} intnum;stringname;charsex;classStudent1:public //聲明派生類 //派生類的公Student1(intn,stringnam,chars,inta,string// }voidshow({cout<<″num:″<<num<<endl;cout<<″name:″<<name<<endl;cout<<″sex:″<<sex<<endl;cout<<″age:″<<age<<endl;cout<<″address:″<<addr<<endl<<endl;}~Student1( //派生類析構(gòu)函 intage;string注意派生類構(gòu)造函數(shù)首行的寫法的一般形式為派生類構(gòu)造函數(shù)名(總參數(shù)表列):基類構(gòu)造函數(shù)名(參數(shù)表列{派生類中新增數(shù)據(jù)成員初始化語(yǔ)句intmain({Student1stud1(10010,″Wang-li″,′f′,19,″115BeijingRoad,Shanghai″);Student1stud2(10011,″Zhang-fun″,′m′,21,″213ShanghaiRoad,Beijing″);stud1.show(); stud2.show //輸出第二個(gè)學(xué)生的數(shù)return}address:115Beijingaddress:213Shanghai可以將構(gòu)造函數(shù)改寫為以下形式Student1(intn,stringnam,chars,inta,string這樣函數(shù)體為空,更顯得簡(jiǎn)單在建立一個(gè)對(duì)象時(shí),執(zhí)行構(gòu)造函數(shù)的順序是①派生類構(gòu)造函數(shù)先調(diào)用基類構(gòu)造函數(shù)~Student1,再執(zhí)行其基類析構(gòu)函數(shù)~Student(11.5.3多層派生時(shí)的構(gòu)造函一個(gè)類不僅可以派生出一個(gè)派生類,派生類還可以繼續(xù)派生,形成派生的層次結(jié)構(gòu)。在上面敘述的基礎(chǔ)上,不難寫出在多級(jí)派生情況下派生類的構(gòu)造函數(shù)。例11.7多級(jí)派生情況下派生類的構(gòu)造函數(shù)#include<iostream>usingnamespacestd;classStudent//聲明基 //公用部Student(intn,stringnam //}voiddisplay //輸出基類數(shù)據(jù)成} //保護(hù)部intnum; stringname;classStudent1:public //聲明公用派生類Student1(intn,charnam[10],inta):Student(n,nam)//派生類構(gòu)造函{age=a; //在此處只對(duì)派生類新增的數(shù)據(jù)成員初始voidshow( //輸出num,name和{display(); cout<<″age:″<<age<<endl;} //派生類的私有數(shù)int //增加一個(gè)數(shù)classStudent2:public //聲明間接公用派生類//下面是間接派生類構(gòu)Student2(intn,stringnam,inta,intvoidshow_all( // show(); }int //增加一個(gè)數(shù)intmain({Student2stud.show_all(); return0;}其派生關(guān)系如圖11.13所示初始化的順序是①先初始化基類的數(shù)據(jù)成員num和name②再初始化Student1的數(shù)據(jù)成員age③最后再初始化Student2的數(shù)據(jù)成員scorevoid{Cylinder1p;}classCylinder1:publicvoidcout<<"圓柱高}voidset(doublex1,doubley1,doubler1,double{Circle::set(x1,y1,r1);double{doubleR=getr();}classCircle{void{cout<<"圓心cout<<endl<<"半徑}voidset(doublex1,doubley1,double{x=x1;y=y1;r=r1; doublegetr(){returnr;}double[例11-(11)]多重繼聲明多重繼承的方如果已聲明了類A、類B和類C,可以聲明多重繼承的派生類classD:publicA,privateB,protected{類D新增加的成員是多重繼承的派生類,它以公有繼承方式繼承A類,以私有繼承方式繼承B類,以保護(hù)繼承方式繼承C類。按不同的繼承方式的規(guī)則繼承C的屬性,確定各基類的成員在派生類中的訪問權(quán)限。多繼承派生類的構(gòu)造函多重繼承派生類的構(gòu)造函數(shù)形式與單繼承時(shí)的構(gòu)造函數(shù)形式基本相同,只是在初始表中包含多個(gè)基類構(gòu)造函數(shù)。如:派生類構(gòu)造函數(shù)名(總參數(shù)表列):基類1構(gòu)造函數(shù)(參數(shù)表列基類2構(gòu)造函數(shù)(參數(shù)表列基類3構(gòu)造函數(shù){派生類中新增數(shù)據(jù)成員初始化語(yǔ)句派生類構(gòu)造函數(shù)的執(zhí)行順序同樣為先調(diào)用基類的調(diào)用基類構(gòu)造函數(shù)的順序是按照聲明派生類時(shí)父基類派生的順序。如上為:基類1、基類2、基類311.8繼承與組在一個(gè)類中以另一個(gè)類的對(duì)象作為數(shù)據(jù)成員的,稱為類的組合(compn。例如,聲明Professor(教授)類是ar(教師)類的派生類,另有一個(gè)類ate(生日),包含,mont,da等數(shù)據(jù)成員??梢詫⒔淌谏盏男畔⒓尤氲絇rofessor類的聲明中。如voiddisplay();intnum;charname[20];charsex;)//{num=n;})//{cout<<"學(xué)號(hào):"<<num<<“姓名:"<<name<<“性別classBirthDate定義生日{(diào)//BirthDate類構(gòu)造函voiddisplay();intyear;intmonth;intday;voidBirthDate::display()//BirthDate類輸出函{cout<<"出生日classProfessor:public //教授voiddisplay();charproGrade; BirthDatebirthday; Professor::Professor(intn,charnam[20],chars,inty,intm,in

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論