繼承的優(yōu)點_第1頁
已閱讀1頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、繼承的優(yōu)點,程式碼再使用 (code reuse)抽象概念再使用類別階層化澄清物件間的關(guān)係,繼承與Code Reuse(被動),主計劃,子計劃1,子計劃2,子計劃3,類別庫函式庫(.lib .dll),,,,,(你所在的組),繼承與Code Reuse,class List {……void insert() {…}void delete() {…}} ;,如果你對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、更高效率的實作方式};void main() {List1 L;…..; L.insert(15) ;cout << L[3] ;},可能結(jié)果,主計劃,子計劃1(List1),子計劃2(List2),子計劃3(沿用List),類別庫(List,Stack…),,,,,繼承與Code Reuse(主動),[先修生]學號系級高中校名選課()註冊(),[僑生] 學號系級e-mail

4、國籍選課()註冊()工讀(),[交換學生]學號系級e-mail國籍選課()註冊()定期約談(),[一般生]學號系級e-mail選課()註冊()工讀(),Q: 設(shè)計一物件導向資料庫: 儲存學校學生資料,作業(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個元素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的第一個元素// list中的ope

8、rator+, -, * 是否也被繼承?} ;,測試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 衍生類別的指標10-2 簡介虛擬函數(shù)10-3 虛擬函數(shù)的細節(jié)10-4 應(yīng)用多型,多型,編譯時期多型(靜態(tài)多型)function overloading如何正確呼叫同名的函數(shù)? 利用參數(shù)個數(shù)與型態(tài)operator overloadi

11、ng其實同function overloading執(zhí)行時期多型 (或動態(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) ;// 哪個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) ; // 哪個setx()b.sety(10); //? 否d = b ; // ?否d.setx(5) ; d.sety(8); // ?可,10-1 衍生類別的指標,Case 1void main() {base *pb ;

14、base b; derived d ;pb = &b ; // Sure!pb->setx(5) ;pb = &d ; // 可乎?pb->setx(5) ; // 哪個?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) ; // 哪個? 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í)行時期的多型?,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);},實際try!輸出結(jié)果為何? car move,甚麼是虛擬函數(shù)?,是一種宣告在基底類別中的成員函數(shù)提供執(zhí)行時期多型的機制使用virtual保留字通常衍生類別會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) ; },實際

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) ; },實際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) ; },實際try!輸出結(jié)果為何? car move,不使用多型可以嗎?,多型: 一個介面多種用法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 ;……}},練習,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來模擬(實作) 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ù)的細節(jié),純粹虛擬函數(shù)(pure virtual function)class printer {string filename ;public:void reset() {… }virtual void print(in

32、t m)=0 ;},抽象類別(abstract class)當類別至少含有一個純粹虛擬函數(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è)計共同的使用介面的類別(衍生類別負責實作)class shape

34、{string name ;public:virtual void draw(char b[][80])=0 ; // 不必有實作virtual void clear()=0 ; //不必有實作};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)或編譯時期繫結(jié)(compiling time bin

36、ding)一般函數(shù)超載函數(shù)夥伴函數(shù)非虛擬之成員函數(shù),晚期繫結(jié)(late binding)或執(zhí)行時期繫結(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(主動),[先修生]學號系級高中校名選課()註冊(),[僑生] 學號系級e-mail國籍選課()註冊()工讀(),[交換學生]學號系級

38、e-mail國籍選課()註冊()定期約談(),[一般生]學號系級e-mail選課()註冊()工讀(),Q: 設(shè)計一物件導向資料庫: 儲存學校學生資料,練習,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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論