版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、繼承的優(yōu)點(diǎn),程式碼再使用 (code reuse)抽象概念再使用類別階層化澄清物件間的關(guān)係,繼承與Code Reuse(被動(dòng)),主計(jì)劃,子計(jì)劃1,子計(jì)劃2,子計(jì)劃3,類別庫函式庫(.lib .dll),,,,,(你所在的組),繼承與Code Reuse,class List {……void insert() {…}void delete() {…}} ;,如果你對(duì)class list 感到 (1) 功能不
2、足 (2) 原有功能不佳,重新改寫??? (1) 原始碼在哪? (2) 還有其他使用者,是否都同意改寫?,繼承與Code Reuse,class List {….. insert(int n) ;…. delete(int pos);};class List1: public List {node& operator[](int index) ; //新增void insert(int n) ; // 修改:
3、更高效率的實(shí)作方式};void main() {List1 L;…..; L.insert(15) ;cout << L[3] ;},可能結(jié)果,主計(jì)劃,子計(jì)劃1(List1),子計(jì)劃2(List2),子計(jì)劃3(沿用List),類別庫(List,Stack…),,,,,繼承與Code Reuse(主動(dòng)),[先修生]學(xué)號(hào)系級(jí)高中校名選課()註冊(cè)(),[僑生] 學(xué)號(hào)系級(jí)e-mail
4、國(guó)籍選課()註冊(cè)()工讀(),[交換學(xué)生]學(xué)號(hào)系級(jí)e-mail國(guó)籍選課()註冊(cè)()定期約談(),[一般生]學(xué)號(hào)系級(jí)e-mail選課()註冊(cè)()工讀(),Q: 設(shè)計(jì)一物件導(dǎo)向資料庫: 儲(chǔ)存學(xué)校學(xué)生資料,作業(yè): list ? stack,struct node {int info; node* next; };class list {node *head, *tail ; int node_no
5、 ;public:list() ;list(const node& n) ;list(const list& L) ;~list() ;int getSize() ;void insert(int pos, int value) ; // 0: first, node_no:lastvoid delete(int pos) ; // 刪除第pos個(gè)元素void show(string msg
6、) ; //印出串列內(nèi)容list& operator=(const list& L) ;friend list operator+(const list& L1, const list& L2) ; //聯(lián)集friend list operator*(const list& L1, const list& L2) ; //交集friend list operator-(co
7、nst list&L1, const list& L2) ; //差集} ;,使用list產(chǎn)生stack,class stack: public list {stack() ;~stack() ;operator=(const stack& s) ;void push(int x) ; //加在list的最前端int pop() ;//刪除list的第一個(gè)元素// list中的ope
8、rator+, -, * 是否也被繼承?} ;,測(cè)試class list,void main() {list L1, L2, L3 ;for (int i = 101; i=105; j--) L2.insert(L2.getSize(), j) ;L1.show(“L1=“); L2.show(“L2=“) ;L3 = L1 + L2 ;L3.show(“L3=L1+L2=“) ;L3 = L1 * L2;L
9、3.show(“L3=L1*L2=“) ;L3 = L1 – L2;L3.show(“L3=L1-L2=“) ;L3.delete(1) ; L3.delete(2) ; L3.show(“after 2 delete, L3=“) ;stack s1, s2 ;for (int k=1; k<=10; k++) { if (k%3==0) s1.pop();s1.push(k) ; s1.sho
10、w(“s1=“) ;}s2 = s1;s2.show(“s2=“) ;},第十章多型與虛擬函數(shù)(Polymorphism & Virtual Functions),10-1 衍生類別的指標(biāo)10-2 簡(jiǎn)介虛擬函數(shù)10-3 虛擬函數(shù)的細(xì)節(jié)10-4 應(yīng)用多型,多型,編譯時(shí)期多型(靜態(tài)多型)function overloading如何正確呼叫同名的函數(shù)? 利用參數(shù)個(gè)數(shù)與型態(tài)operator overloadi
11、ng其實(shí)同function overloading執(zhí)行時(shí)期多型 (或動(dòng)態(tài)多型)如何正確呼叫不同物件的相同名稱的成員函數(shù) ? 利用繼承與多型,衍生類別與基底類別物件間的指定(assignment),class base { int x ; public: setx(int n) { x=n;} } ;class derived: public base {int y ;public:setx(int n) {
12、 base::setx(3*n);}sety(int n) { y = n;}} ;,void main() {base b ;derived d ;b = d ; // 可乎?b.setx(5) ;// 哪個(gè)setx()b.sety(10); //?d = b ; // ?d.setx(5) ; d.sety(8); // ?},結(jié)論,base Obj = derived Obj (可)der
13、ived Obj = base Obj (否),void main() {base b ;derived d ;b = d ; // 可b.setx(5) ; // 哪個(gè)setx()b.sety(10); //? 否d = b ; // ?否d.setx(5) ; d.sety(8); // ?可,10-1 衍生類別的指標(biāo),Case 1void main() {base *pb ;
14、base b; derived d ;pb = &b ; // Sure!pb->setx(5) ;pb = &d ; // 可乎?pb->setx(5) ; // 哪個(gè)?pb->sety(10); // ? 否},case 2void main() {derived *pd ;base b; derived d ;pd = &b ; // ??? 否
15、pd->setx(5) ; // ?否},衍生類別的參考(reference),Case 1void main() {base b; derived d ;base &refb1 = b ; // surerefb1.setx(5) ; // 哪個(gè)? basebase& refb2 = d ; // ?? 可 refb2.setx(5) ;refb2.sety(10);
16、// ?? 否},case 2void main() {base b; derived d ;derived &refd1 = b ; //?否refb1.setx(5) ;},結(jié)論: 自己寫,base-pointer = &derived-Obj (可)base-reference = derived-Obj (可),derived-pointer = &base-Obj (否)
17、derived-reference = base-Obj (否),10-2 多型與虛擬函數(shù),甚麼是執(zhí)行時(shí)期的多型?,void main() {Benz b; Volvo v; Civic c ;demo(b); demo(v); demo(c) ;}void demo(car& c) { c.move() ; c.stop() ;},class car { … move() ; …stop();} ;,clas
18、s Benz: public car {…move() ; …stop();} ;,class Volvo: public car {…move() ; …stop(); } ;,class Civic: public car {…move() ; … stop(); } ;,不使用虛擬函數(shù),class car {public:void move() { cout << “car move”;}} ;class Be
19、nz: public car {public:void move() { cout << “Benz move”;}} ;class Volvo: public car {public:void move() { cout << “Volvo move”;}} ;void demo(car& c) { c.move() ; } void main(){Benz b;Volvo v;dem
20、o(b);demo(v);},實(shí)際try!輸出結(jié)果為何? car move,甚麼是虛擬函數(shù)?,是一種宣告在基底類別中的成員函數(shù)提供執(zhí)行時(shí)期多型的機(jī)制使用virtual保留字通常衍生類別會(huì)override它,使用虛擬函數(shù) (配合reference),class car {virtual void move() { cout << “car move”;}} ;class Benz: public
21、 car {void move() { cout << “Benz move”;}} ;class Volvo: public car {void move() { cout << “Volvo move”;}} ;void demo(car& c) { c.move() ; } void main() { Benz b ;Volvo v; demo(b); demo(v) ; },實(shí)際
22、try!輸出結(jié)果為何? Benz move Volvo move,使用虛擬函數(shù)(配合pointer),class car {virtual void move() { cout move() ; } void main() { Benz b ;Volvo v; demo(&b); demo(&v) ; },實(shí)際try!輸出結(jié)果為何?
23、 Benz move Volvo move,使用虛擬函數(shù) (配合物件傳遞),class car {virtual void move() { cout << “car move”;}} ;class Benz: public car {void move() { cout << “Benz move”;}} ;class Volvo: pub
24、lic car {void move() { cout << “Benz move”;}} ;void demo(car c) { c.move() ; } void main() { Benz b ;Volvo v; demo(b); demo(v) ; },實(shí)際try!輸出結(jié)果為何? car move,不使用多型可以嗎?,多型: 一個(gè)介面多種用法void move(car& c)
25、{ c.move() ; ….} 不多型:void move(void *p, int type) {switch(type){case 1: ((Benz *)p)->move(); break ;case 2: ((Volvo *)p)->move(); break ;……}},練習(xí),class plane {virtual void fly() { takeoff();
26、 onAir(); landing();}void onAir() {……}void takeoff() {……}void landing() {……}} ;// 你不滿意takeoff的行為該如何?,Plane,class plane{public:virtual void fly() { takeoff(); onAir(); landing();}void onAir() {cout<<&qu
27、ot;onAir"<<endl;}virtualvoid takeoff() {cout<<"takeoff"<<endl;}void landing() {cout<<"landing"<<endl;}};,class F16:public plane{public://void fly(){cout<&
28、lt;"F16 fly"<<endl;}void takeoff(){cout<<"F16 takeoff"<<endl;}};class B747:public plane{public://void fly(){cout<<"B747 fly"<<endl;}void takeoff(){cou
29、t<<"B747 takeoff"<<endl;}};,void demo(plane &p){p.fly();}void main(){ B747 b;F16 f;demo(b);demo(f);},Case Study: p. 10-19,#1,#2,#n,,,,,,head,store(x); retrieve();,#n,,#1,,stack,#1,
30、#2,#n,,,,如何利用list來模擬(實(shí)作) stack與queue,list,queue,,store,,retrieve,,,retrieve,store,繼承示意圖,class list {…virtual void store(int i) ;virtual int retrieve() ;} ;,class stack: public list {…void store(int i) ;int r
31、etrieve() ;} ;,class queue: public list {…void store(int i) ;int retrieve() ;} ;,,,10-3 更多虛擬函數(shù)的細(xì)節(jié),純粹虛擬函數(shù)(pure virtual function)class printer {string filename ;public:void reset() {… }virtual void print(in
32、t m)=0 ;},抽象類別(abstract class)當(dāng)類別至少含有一個(gè)純粹虛擬函數(shù)時(shí)不能用來產(chǎn)生物件 e.g. printer p ; //XX,純粹虛擬函數(shù)的內(nèi)容,純粹虛擬函數(shù)(pure virtual function)class printer {string filename ;public:virtual void reset()=0;virtual void print(int mod
33、e)=0 ; },純粹虛擬函數(shù)的特性,衍生類別一定要override 基底類別中所有的純粹虛擬函數(shù)class printer {…...};class HPLaserJet6L: public printer {……void reset() { …自己的版本…}void print(int mode) {…自己的版本…}};,抽象類別的用途(一),設(shè)計(jì)共同的使用介面的類別(衍生類別負(fù)責(zé)實(shí)作)class shape
34、{string name ;public:virtual void draw(char b[][80])=0 ; // 不必有實(shí)作virtual void clear()=0 ; //不必有實(shí)作};class triangle: public shape {………} ;class circle: public shape {……};,抽象類別的用途(二),防止使用者產(chǎn)生不允許存在的物件class shape {
35、string name ;public:virtual void draw()=0 ;};class triangle: public shape {………} ;class circle: public shape {……};void main() { shape s ; /* what ??? */ ….. },10-4 應(yīng)用多型,早期繫結(jié)(early binding)或編譯時(shí)期繫結(jié)(compiling time bin
36、ding)一般函數(shù)超載函數(shù)夥伴函數(shù)非虛擬之成員函數(shù),晚期繫結(jié)(late binding)或執(zhí)行時(shí)期繫結(jié)(run-time binding)虛擬函數(shù) (效率較差),例子,early bindingvoid fun(int x) { cout << x;}void main() {fun(5) ; // early binding},late binding// 承前例void move(car&a
37、mp; c) {c.move() ; // late binding}void main() {Benz b; Volvo v ; int x ;cin >> x ;if (x%2) b.move(); …..,繼承與Code Reuse(主動(dòng)),[先修生]學(xué)號(hào)系級(jí)高中校名選課()註冊(cè)(),[僑生] 學(xué)號(hào)系級(jí)e-mail國(guó)籍選課()註冊(cè)()工讀(),[交換學(xué)生]學(xué)號(hào)系級(jí)
38、e-mail國(guó)籍選課()註冊(cè)()定期約談(),[一般生]學(xué)號(hào)系級(jí)e-mail選課()註冊(cè)()工讀(),Q: 設(shè)計(jì)一物件導(dǎo)向資料庫: 儲(chǔ)存學(xué)校學(xué)生資料,練習(xí),class student {protected:string studID, name, eMail ;public:void fillData()=0 ;void getID() { return ID; }void show()
39、=0 ;} ;class LocalStudent: public student {string ID ; ……}class AbroadStudent: public student {string passportID; string country ;……},續(xù),class IMStudents {const int MAX_STUD ;student *stud[720] ;public:stu
溫馨提示
- 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. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 繼承傳統(tǒng)教學(xué)優(yōu)點(diǎn) 創(chuàng)新高中數(shù)學(xué)教學(xué)
- 人性的優(yōu)點(diǎn)
- 《人性的優(yōu)點(diǎn)》
- 聚氨酯的優(yōu)點(diǎn)
- 中介的優(yōu)點(diǎn)
- 人性的優(yōu)點(diǎn)
- 買辦制度的優(yōu)點(diǎn)
- 跨國(guó)并購(gòu)的優(yōu)點(diǎn)
- 種植牙的優(yōu)點(diǎn)
- led燈的優(yōu)點(diǎn)
- hws合金的優(yōu)點(diǎn)
- 烤豬蹄的優(yōu)點(diǎn)
- 環(huán)保電源的優(yōu)點(diǎn)
- 多媒體的優(yōu)點(diǎn)
- 淺談cad技術(shù)的優(yōu)點(diǎn)
- 顯示屏的優(yōu)點(diǎn)
- 自制餅干的最大優(yōu)點(diǎn)
- 環(huán)氧地坪的優(yōu)點(diǎn)
- 鋼結(jié)構(gòu)工程的優(yōu)點(diǎn)
- 要發(fā)現(xiàn)孩子的優(yōu)點(diǎn)
評(píng)論
0/150
提交評(píng)論