




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、22:16:261C+程序設(shè)計教程(第二版)第十三章 抽象類 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è)計演繹概念設(shè)計(Deducting Concept Design) 6.系統(tǒng)擴展系統(tǒng)擴展(S
2、ystem Extension) 7.手柄手柄(Handle) 22:16:2631. 抽象基類抽象基類 ( Abstract Base-Class ) 繼承體系的多態(tài)問題:n繼承體系反映的是事物的分層分類,它是倒樹狀,頂端是基類越頂端越抽象,越底端越具體n基類往往是一種概念表達,或者像Account類那樣,僅僅提取了各個子類的共性,本身并不構(gòu)成有意義的實體這種基類的成員都是為子類提供的特別是虛函數(shù),不同的子類有不同的實現(xiàn),于基類中的定義版本并無意義class Account / .public: virtual void withdrawal(double amount) return; /
3、 無意義 ;22:16:264虛函數(shù)都是從基類傳播的,靠基類指針來掀動多態(tài)因而,為多態(tài)性之故,非得在基類設(shè)置虛函數(shù)不可: class A; / 基類中無fn()成員class B : public Apublic: virtual void fn();class C : public Apublic: virtual void fn();void f(A* pa) pa-fn(); / 編譯錯void g() f(&B(); f(&C();22:16:265編譯器的語法規(guī)定,如果一個函數(shù)被調(diào)用了,則該函數(shù)若只有聲明而沒有定義是萬萬不能的 class Apublic: virtu
4、al void fn(); / 無定義; class B : public Apublic: void fn();class C : public Apublic: void fn();void f(A* pa) pa-fn(); / 鏈接錯void g() f(&B(); f(&C();22:16:266純虛函數(shù)純虛函數(shù) class Account/抽象類public: virtual void withdrawal(double amount)=0;Account a(“3”, 30); / 錯:創(chuàng)建對象之故前提:不同的子類表現(xiàn)不同的行為多態(tài),而基類并不產(chǎn)生對象只是擺設(shè)目的
5、:為了安全性,將基類抽象化,僅用來繼承,不準(zhǔn)許產(chǎn)生對象手法:設(shè)置純虛函數(shù)。即在基類虛函數(shù)聲明后面加上”=0”,不須提供定義體,表明為抽象類任何抽象類若有創(chuàng)建對象操作,則是非法的22:16:2672. 抽象類與具體類抽象類與具體類 ( Abstract & Concrete Classes )運行下列程序: 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();如果要解決的問題涉及單一的類對象,無須
7、繼承.如果涉及許多相關(guān)的類對象,則需建立一個具有多態(tài)的繼承體系.也許該繼承體系的基類只是用來繼承,別無目的,但抽象基類卻足以將問題中的概念描述清楚.22:16:2683. 深度隔離的界面深度隔離的界面 ( Interface Which Deeply Parted ) 類定義頭文件若有修改,將引起類的實現(xiàn)和類的應(yīng)用程序重新編譯.界面不變是指外界可以訪問的公有成員不變,而不是類定義頭文件不變.類的實現(xiàn)細(xì)節(jié)可能涉及私有成員的變更.例如:下列兩個類界面相同,但類定義不同,頭文件自然就不同了其類的實現(xiàn)也不會相同日期的年月日版日期的年月日版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è)法將界面和類定義分離,來實現(xiàn)深度界面隔離.該類作為界面,便不會影響應(yīng)用編程該類作為界面,便不會影響應(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界面類的實現(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);這樣一來,類DateMid的實現(xiàn)也不影響界面Date.以Date類作為分界線,便可以進行充分的抽象編程了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類的對應(yīng)成員,何不將界面Date類做成抽象類呢?!這樣一來,應(yīng)用程序可以通過類體系的多態(tài)性來自在使用Date類另一方面,DateMid的實現(xiàn)可以作為繼承界面類Date的具體類.22:16:2612可以還具體類Date以本來面貌,但這次是從IDate類繼承而來: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);對象的析構(gòu)是自動的讓對象指針做成對象,便可以免遭人工釋放所帶來的誤操作之苦
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年壓瘡護理新進展
- 客戶開發(fā)工作總結(jié)案例
- 電梯安全培訓(xùn)
- 兒童財商教育課件
- 內(nèi)科護理10分鐘小講課
- 倉儲物流中心廠房出租與倉儲服務(wù)外包協(xié)議
- 心梗老人的護理
- 知識產(chǎn)權(quán)采購合同范本:電子元器件行業(yè)
- 創(chuàng)新型企業(yè)廠房物業(yè)管理及創(chuàng)新解決方案合同范本
- 物業(yè)服務(wù)企業(yè)人力資源配置合同
- 2023年瀘州市文化和旅游系統(tǒng)事業(yè)單位招聘筆試模擬試題及答案
- 醫(yī)療器械行業(yè)市場部人員崗位職責(zé)
- (中醫(yī)內(nèi)科)高級、副高級職稱考試模擬試題及答案
- 跌倒墜床原因分析預(yù)防措施
- 部編版小學(xué)道德與法治三年級下冊期末質(zhì)量檢測試卷【含答案】5套
- 弱電施工安全技術(shù)交底
- DB21T 3354-2020 遼寧省綠色建筑設(shè)計標(biāo)準(zhǔn)
- 安全生產(chǎn)知識應(yīng)知應(yīng)會
- 08S305-小型潛水泵選用及安裝圖集
- 體育器材采購設(shè)備清單
- 二手車鑒定評估報告書最終
評論
0/150
提交評論