C++程序設(shè)計(jì)教程 第十三章 抽象類_第1頁(yè)
C++程序設(shè)計(jì)教程 第十三章 抽象類_第2頁(yè)
C++程序設(shè)計(jì)教程 第十三章 抽象類_第3頁(yè)
C++程序設(shè)計(jì)教程 第十三章 抽象類_第4頁(yè)
C++程序設(shè)計(jì)教程 第十三章 抽象類_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、22:16:261C+程序設(shè)計(jì)教程(第二版)第十三章 抽象類 Chapter 13 Abstract Class 22:16:262第十三章內(nèi)容1.抽象基類抽象基類(Abstract Base-Class) 2.抽象類與具體類抽象類與具體類(Abstract & Concrete Classes) 3.深度隔離的界面深度隔離的界面 (Interface Which Deeply Parted) 4.抽象類作界面抽象類作界面(Abstract Class As Interface) 5.演繹概念設(shè)計(jì)演繹概念設(shè)計(jì)(Deducting Concept Design) 6.系統(tǒng)擴(kuò)展系統(tǒng)擴(kuò)展(S

2、ystem Extension) 7.手柄手柄(Handle) 22:16:2631. 抽象基類抽象基類 ( Abstract Base-Class ) 繼承體系的多態(tài)問(wèn)題:n繼承體系反映的是事物的分層分類,它是倒樹(shù)狀,頂端是基類越頂端越抽象,越底端越具體n基類往往是一種概念表達(dá),或者像Account類那樣,僅僅提取了各個(gè)子類的共性,本身并不構(gòu)成有意義的實(shí)體這種基類的成員都是為子類提供的特別是虛函數(shù),不同的子類有不同的實(shí)現(xiàn),于基類中的定義版本并無(wú)意義class Account / .public: virtual void withdrawal(double amount) return; /

3、 無(wú)意義 ;22:16:264虛函數(shù)都是從基類傳播的,靠基類指針來(lái)掀動(dòng)多態(tài)因而,為多態(tài)性之故,非得在基類設(shè)置虛函數(shù)不可: class A; / 基類中無(wú)fn()成員class B : public Apublic: virtual void fn();class C : public Apublic: virtual void fn();void f(A* pa) pa-fn(); / 編譯錯(cuò)void g() f(&B(); f(&C();22:16:265編譯器的語(yǔ)法規(guī)定,如果一個(gè)函數(shù)被調(diào)用了,則該函數(shù)若只有聲明而沒(méi)有定義是萬(wàn)萬(wàn)不能的 class Apublic: virtu

4、al void fn(); / 無(wú)定義; class B : public Apublic: void fn();class C : public Apublic: void fn();void f(A* pa) pa-fn(); / 鏈接錯(cuò)void g() f(&B(); f(&C();22:16:266純虛函數(shù)純虛函數(shù) class Account/抽象類public: virtual void withdrawal(double amount)=0;Account a(“3”, 30); / 錯(cuò):創(chuàng)建對(duì)象之故前提:不同的子類表現(xiàn)不同的行為多態(tài),而基類并不產(chǎn)生對(duì)象只是擺設(shè)目的

5、:為了安全性,將基類抽象化,僅用來(lái)繼承,不準(zhǔn)許產(chǎn)生對(duì)象手法:設(shè)置純虛函數(shù)。即在基類虛函數(shù)聲明后面加上”=0”,不須提供定義體,表明為抽象類任何抽象類若有創(chuàng)建對(duì)象操作,則是非法的22:16:2672. 抽象類與具體類抽象類與具體類 ( Abstract & Concrete Classes )運(yùn)行下列程序: void g(Display* d) d-init(); d-write();int main() g(&Monochrome(); g(&SVGA();結(jié)果為:MonochromeColorAdapterclass Displaypublic: virtual vo

6、id init() = 0; virtual void write() = 0;class Monochrome : public Display virtual void init() virtual void write() cout“Monochromen”; ;class ColorAdapter : public Displaypublic: virtual void write() cout“ColorAdaptern”; ;class SVGA : public ColorAdapterpublic: virtual void init();如果要解決的問(wèn)題涉及單一的類對(duì)象,無(wú)須

7、繼承.如果涉及許多相關(guān)的類對(duì)象,則需建立一個(gè)具有多態(tài)的繼承體系.也許該繼承體系的基類只是用來(lái)繼承,別無(wú)目的,但抽象基類卻足以將問(wèn)題中的概念描述清楚.22:16:2683. 深度隔離的界面深度隔離的界面 ( Interface Which Deeply Parted ) 類定義頭文件若有修改,將引起類的實(shí)現(xiàn)和類的應(yīng)用程序重新編譯.界面不變是指外界可以訪問(wèn)的公有成員不變,而不是類定義頭文件不變.類的實(shí)現(xiàn)細(xì)節(jié)可能涉及私有成員的變更.例如:下列兩個(gè)類界面相同,但類定義不同,頭文件自然就不同了其類的實(shí)現(xiàn)也不會(huì)相同日期的年月日版日期的年月日版class Date int year, month, day;

8、public: Date(const string& s); Date(int n=1); Date(int y, int m, int d); Date operator+(int n)const; Date& operator+=(int n); Date& operator+(); friend ostream& operator( ostream& o, const Date& d );日期的天數(shù)版日期的天數(shù)版class Date int absDay;public: Date(const string& s); Date(int

9、 n=1); Date(int y, int m, int d); Date operator+(int n)const; Date& operator+=(int n); Date& operator+(); friend ostream& operator( ostream& o, const Date& d );22:16:269設(shè)法將界面和類定義分離,來(lái)實(shí)現(xiàn)深度界面隔離.該類作為界面,便不會(huì)影響應(yīng)用編程該類作為界面,便不會(huì)影響應(yīng)用編程class Date Datemid* m_p;public: Date(const string& s)

10、; Date(int n=1); Date(int y, int m, int d); Date operator+(int n)const; Date& operator+=(int n); Date& operator+(); friend ostream& operator( ostream& o, const Date& d );DateMid類即為以前的類即為以前的Date類類:class DateMid int year, month, day;public: DateMid(const string& s); DateMId(int

11、 n=1); DateMid(int y, int m, int d); DateMid operator+(int n)const; DateMid& operator+=(int n); DateMid& operator+(); friend ostream& operator( ostream& o, const DateMid& d );22:16:2610界面類的實(shí)現(xiàn),便是Date到DateMid的轉(zhuǎn)換#include”date.h”#include”datemid.h”Date:Date(const string s):m_p(new Da

12、teMid(s)Date:Date(int n):m_p(new DateMid(n)Date:Date(int y, int m, int d):m_p(new DateMid(y,m,d)Date:Date(const DateMid& d):m_p(new DateMid(d)Date:Date() delete m_p; Date Date:operator+(int n)const return *m_p + n; Date& Date:operator+=(int n) *m_p += n; return *this; Date& Date:operator

13、+() *m_p += 1; return *this; ostream& operator(ostream& o, const Date& d) return o*(d.m_p);這樣一來(lái),類DateMid的實(shí)現(xiàn)也不影響界面Date.以Date類作為分界線,便可以進(jìn)行充分的抽象編程了22:16:26114. 抽象類作界面抽象類作界面 ( Abstract Class As Interface )抽象類抽象類IDate作界面作界面class IDatepublic: virtual IDate() virtual IDate& operator+(int n)

14、= 0; virtual IDate& operator+=(int n) = 0; virtual IDate& operator+() = 0; virtual void print(ostream& o)const=0;IDate& createDate(int y, int m, int d);IDate& createDate(int n);IDate& createDate(const string s);inline ostream& operator( ostream& o, const IDate& d)

15、 d.print(o); return o;作為界面的Date類轉(zhuǎn)而去調(diào)用DateMid類的對(duì)應(yīng)成員,何不將界面Date類做成抽象類呢?!這樣一來(lái),應(yīng)用程序可以通過(guò)類體系的多態(tài)性來(lái)自在使用Date類另一方面,DateMid的實(shí)現(xiàn)可以作為繼承界面類Date的具體類.22:16:2612可以還具體類Date以本來(lái)面貌,但這次是從IDate類繼承而來(lái):class Date:public IDate int year, month, day;public: Date(const string& s); Date(int n=1); Date(int y, int m, int d); Date operator+(int n)const; Date& operator+=(int n); Date& operator+(); friend ostream& operator() return sp; SonyHandle(Sony* pp) : sp(pp);對(duì)象的析構(gòu)是自動(dòng)的讓對(duì)象指針做成對(duì)象,便可以免遭人工釋放所帶來(lái)的誤操作之苦

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論