




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、C+面向?qū)ο蟪绦蛟O(shè)計(jì)教學(xué)內(nèi)容 第1章 C+概述第2章 類和對象第3章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述第4章 進(jìn)一步學(xué)習(xí)類和對象第5章 堆與復(fù)制構(gòu)造函數(shù)第6章 繼承性:派生類第7章 運(yùn)算符重載第8章 虛函數(shù)和多態(tài)性第9章 模板第10章 類庫和C+的標(biāo)準(zhǔn)模板庫STL第11章 輸入輸出流第12章 異常處理第6章 繼承性:派生類6.1 派生類的概念6.2 單繼承6.3 派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)6.4 多重繼承6.5 賦值兼容規(guī)則6.6 應(yīng)用舉例6.1 派生類的概念 保持已有類的特性而構(gòu)造新類的過程稱為繼承。 在已有類的基礎(chǔ)上新增自己的特性而產(chǎn)生新類的過程稱為派生。 被繼承的已有類稱為基類或父類)。 派生出的新
2、類稱為派生類或子類)。繼承與派生問題舉例圓圓矩形矩形幾何形狀幾何形狀繼承與派生的目的 繼承的目的:實(shí)現(xiàn)代碼重用。 派生的目的:當(dāng)新的問題出現(xiàn),原有程序無法解決或不能完全解決時,需要對原有程序進(jìn)行改造。 C+中類的繼承層次自然地表達(dá)了人們分析問題時所用的分類結(jié)構(gòu)。大大改善了軟件系統(tǒng)的可理解性和可維護(hù)性。 派生類的聲明class 派生類名:訪問權(quán)限 基類名1, . 成員定義;多繼承:一個派生類有多個基類;單繼承:一個派生類只有一個基類。派生類的例子Class Student int number; char *name; float score;public: Student(int number
3、1, char* name1, float score1); void modify(float score1); void print( );派生類的例子續(xù))class Ustudent:public Student char major; /專業(yè)public: Ustudent(int number1, char *name1, char *major, float score1); void print( );/ Ustudent 為大學(xué)生類派生類基類繼承方式 共有三種繼承方式:公有繼承public),私有繼承private),保護(hù)繼承protected)。 繼承方式指定派生類成員以及類
4、外對象對繼承來的成員的訪問權(quán)限。 不同繼承方式的影響主要體現(xiàn)在: 1、派生類成員對基類成員的訪問控制。 2、派生類對象對基類成員的訪問控制。公有派生 (public) 當(dāng)被繼承的基類的訪問說明符是public的時候,所有基類的公共成員都成為派生類的公共成員。 派生類中的成員函數(shù)可以直接訪問基類中的public,但不能訪問基類的private成員。 派生類的對象只能訪問基類的public成員。私有派生(private) 基類的所有公共成員都成為派生類的私有成員。 派生類中的成員函數(shù)可以直接訪問基類中的public成員,但不能訪問基類的private成員。 派生類的對象不能訪問基類中的任何成員。p
5、rotected 關(guān)鍵字的引入 無論基類被怎樣繼承,基類中的私有成員都不能被其導(dǎo)出類直接訪問。只能通過公共接口訪問。 繼承來的特性不能使用似乎于理不通,但是派生類不加限制的訪問基類的私有成員,將破壞基類的封裝性,這是面向?qū)ο蠓椒ㄖ杏袪幾h的問題之一。(兩難問題) C+中引入了保護(hù)段(protected)的概念,這樣可以讓用戶根據(jù)需要靈活地加以限制。protected 關(guān)鍵字 派生類的成員函數(shù)不能直接訪問基類的私有private成員。但派生類的成員函數(shù)能訪問基類的被保護(hù)protected成員。 除了基類的被保護(hù)成員對于基類的任何派生類成員都是可訪問的以外,protected 訪問說明符與priva
6、te說明符是完全等效的。保護(hù)繼承(protected) 基類的public和protected成員都以protected身份出現(xiàn)在派生類中,但基類的private成員不可訪問。 派生類中的成員函數(shù)可以直接訪問基類中的public和protected成員,但不能訪問基類的private成員。 派生類的對象不能訪問基類中的任何成員。6.2 單繼承 派生類只有一個基類的時稱為單繼承。 單繼承時類層次為樹形結(jié)構(gòu)工具車轎車面包車小汽車卡車旅行車汽車汽車交通工具交通工具單繼承的例子/ string.hpp class String private: static int maxLength; char*
7、content; int length; public: String(); String(char*); String(String&); String(); String& operator=(char*); String& operator=(String&); int GetLength(); char* GetContent(); . ;/ editstring.hpp class EditString : public String private: int cursor; public: EditString(char *); EditString
8、(EditString); EditString(); int GetCursor(); void MoveCursor(int i); void Insert(char*); void Insert(String&); void Replace(char*); void Replace(String&); void Delete(int n); ;單繼承的例子續(xù))#include “editstring.hpp”main( ) String s1(“abc”); EditString s2(“this is a string.”); char str20; strcpy(st
9、r, s2.GetContent(); s2.MoveCursor(4); s2.Delete(5); s2.MoveCursor(6); s2.Insert(“ is “); s2.Insert(s1); cout“s1=“s1.GetContent( )endl; cout“s2=“s2.GetContent( )endl;StringEditStrings1s2派生類的對象中有一個無名的基類對象多層繼承 所謂多層繼承是指從一個類派生出一個類,然后又從該派生類派生出另一個類,如此進(jìn)行下去,直到最后生成的類滿足要求為止。 例如: point點(diǎn)) line線) rectangle矩形) 猴猴子
10、子獅子虎獵豹貓貓鳥鳥動動物物6.3 派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)反。反。派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)的例子class pointchar c;public:point(char ch)c=ch;void DrawPoint()coutc;class line:public pointint length;public:line(char ch,int i):point(ch) length=i; void DrawLine()length=(length80?80:length);for(int i=0;ilength;i+)DrawPoint();coutendl;一個參數(shù)傳遞鏈 :將參數(shù)傳遞給
11、基類的構(gòu)造函數(shù)派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)的例子續(xù))class rectangle : public lineint width;public:rectangle(char ch,int i,int j) : line(ch,i) width=j; void DrawRect()width=(width25?25:width);for(int i=0;iwidth;i+)DrawLine( );一個參數(shù)傳遞鏈 :將參數(shù)傳遞給基類的構(gòu)造函數(shù)派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)的例子續(xù))void main()rectangle A(X,30,10);A.DrawRect();/ getch( );繼承是重用的
12、基礎(chǔ) 面向?qū)ο蟮某绦蛟O(shè)計(jì)中通過繼承實(shí)現(xiàn)重用reuse便于重用,擴(kuò)大。 可以在原有的基礎(chǔ)上擴(kuò)充,不修改原有代碼。 即使原來的代碼完全不符合當(dāng)前的要求,也不必修改原有的代碼。可以只增加新的代碼來實(shí)現(xiàn)新的功能。覆蓋與支配規(guī)則 函數(shù)覆蓋:函數(shù)覆蓋: 在派生類中可以重新定義基在派生類中可以重新定義基類中已定義的同名函數(shù),我們稱之類中已定義的同名函數(shù),我們稱之為函數(shù)覆蓋。為函數(shù)覆蓋。 支配規(guī)則:支配規(guī)則: 派生類的對象引用某函數(shù)時,編譯派生類的對象引用某函數(shù)時,編譯器先在派生類中找與該函數(shù)完全匹器先在派生類中找與該函數(shù)完全匹配的函數(shù),有則調(diào)用之;配的函數(shù),有則調(diào)用之; 否則到其基類中找,依次再到基類否則到
13、其基類中找,依次再到基類的基類中找,的基類中找,等等,若都沒有等等,若都沒有找到則出錯。找到則出錯。 若第一次遇到了同名函數(shù)但參數(shù)不若第一次遇到了同名函數(shù)但參數(shù)不匹配,則對其進(jìn)行類型轉(zhuǎn)換后再調(diào)匹配,則對其進(jìn)行類型轉(zhuǎn)換后再調(diào)用之,若無法轉(zhuǎn)換則出錯。用之,若無法轉(zhuǎn)換則出錯。函數(shù)覆蓋的例子函數(shù)覆蓋的例子#include #include class person char name10;int age;public:person()age=0;void set(int i,char *str)age=i;strcpy(name,str);void display( )coutname is age
14、years old.endl;函數(shù)覆蓋的例子續(xù))函數(shù)覆蓋的例子續(xù))class student : public personint math, chinese, english;public:student( ) math=chinese=english=0; void SetScore(int i,int j,int k)math=i; chinese=j; english=k;void display()coutThe students score is: endlmath: mathendlchinese: chineseendlenglish: englishendl;函數(shù)覆蓋的例子續(xù)
15、)函數(shù)覆蓋的例子續(xù))void main(void)student st;st.set(15,Wang);st.SetScore(88,85,90);st.person:display();st.display();第四章 繼承性:派生類4.1派生類的概念4.2單繼承4.3多繼承4.4賦值兼容規(guī)則4.5應(yīng)用舉例6.4 多繼承從兩個以上的基類派生出新類,例如:class 派生類名:繼承方式1 基類名1,繼承方式2 基類名2,.派生類的成員定義;注意:每一個“繼承方式”,只用于限制對緊隨其后之基類的繼承。多繼承舉例class A public: void setA(int); void showA(
16、); private: int a;class B public: void setB(int); void showB();private: int b;class C : public A, private B public: void setC(int, int, int); void showC(); private: int c;void A:setA(int x) a=x; void B:setB(int x) b=x; void C:setC(int x, int y, int z) SetA(x); /派生類成員直接訪問 SetB(y); /基類的公有成員 c=z;/其它函數(shù)實(shí)
17、現(xiàn)略int main() C obj; obj.setA(5); obj.showA(); obj.setC(6,7,9); obj.showC( ); obj.setB(6); / 錯誤,私有繼承 obj.showB( ); /錯誤,私有繼承 return 0;多繼承與單繼承C+的多繼承可以看成由多個單繼承形成的,這樣以來,除了每個派生類的實(shí)例對象中包含所有的基類的無名對象外,它與單繼承并無區(qū)別。多繼承的構(gòu)造函數(shù) 同單繼承一樣,多繼承的派生類要在其構(gòu)造函數(shù)中激活所有的基類的構(gòu)造函數(shù)。 調(diào)用次序: 先基類,后派生類;基類的調(diào)用次序以派生類定義中所聲明的基類的出現(xiàn)順序而定。 例:ABDFEC內(nèi)存
18、對象分布圖示意性定義為:示意性定義為:class A ;class B ;class C ;class D:public B,public A ;class E:public C ;class F:public D,public E ;構(gòu)造函數(shù)的調(diào)用次序?yàn)椋簶?gòu)造函數(shù)的調(diào)用次序?yàn)椋篈、B、D、C、E、FFFDEDABABECC基類與派生類的對應(yīng)關(guān)系 單繼承 派生類只從一個基類派生。 多繼承 派生類從多個基類派生。 多重派生 由一個基類派生出多個不同的派生類。 多層派生 派生類又作為基類,繼續(xù)派生新的類。多繼承引入的二義性問題舉例class B public: int b;class B1 : p
19、ublic B private: int b1;class B2 : public B private: int b2;class C : public B1,public B2 public: int f( ); private: int d;BB1B2C下面的訪問是二義性的:C c;c.bc.B:b下面是正確的:c.B1:bc.B2:b二義性問題舉例續(xù))bb1bb2dB類子對象B類子對象B1類子對象B2類子對象C類對象由于派生類的對象中多次包含了某個基類的對象,從而產(chǎn)生了二義性。派生類C的對象的存儲結(jié)構(gòu)示意圖二義性問題解決方案:虛基類class B private: int b;class
20、 B1 : virtual public B private: int b1;class B2 : virtual public B private: int b2;class C : public B1, public B2 private: float d;下面的訪問是正確的:C d;d.b;為了對祖先類只繼承一次,C+引入了虛基類的概念。BB1B2Cb1b2dB1類子對象B2類子對象C類對象bB類子對象虛基類的派生類對象存儲結(jié)構(gòu)示意圖虛基類的例子class basepublic:int i;class derived1:virtual public basepublic:int j;cl
21、ass derived2:virtual public basepublic:int k;Inherit base as virtual.Inherit base as virtual, here too.class derived3:public derived1,public derived2public:int product( )return i*j*k;main( )derived3 ob;ob.i=10; / unambiguous because only one copy presentob.j=3;ob.k=5;coutProduct is duct()print
22、1( );/正確,可以調(diào)用基類繼承的成員 ptr-print2( );/錯誤,不能訪問派生類的成員實(shí)例賦值兼容舉例B0類void display();B1類void display( );D1類void display( );#include class B0public:void display()coutB0:display()endl;class B1:public B0public:void display( )coutB1:display()endl;class D1:public B1public:void display( )coutD1:display()display( );
23、void main( )B0 b0;B1 b1;D1 d1;B0 *p;p=&b0;fun(p);p=&b1;fun(p);p=&d1;fun(p);執(zhí)行結(jié)果:B0:display( )B0:display( )B0:display( )賦值兼容舉例續(xù))以后我們會看到運(yùn)行時的多態(tài)就是通過基類對象的指針指向派生類對象來實(shí)現(xiàn)的6.6 應(yīng)用舉例 人員管理系統(tǒng): 有三類人員:經(jīng)理、技術(shù)人員、推銷人員,還有銷售經(jīng)理。 月薪:經(jīng)理:8000元/月;技術(shù)人員:100元/小時;推銷人員:4%提成;銷售經(jīng)理:5000元月+5%提成。應(yīng)用舉例 類設(shè)計(jì) 基類:employee 派生類:tec
24、hnician和salesman 多繼承派生類:salesmanagerclass employee protected: char *name; /姓名 int individualEmpNo; /個人編號 int grade; /級別 float accumPay; /月薪總額 static int employeeNo; /本公司職員編號目前最大值 public: employee(); /構(gòu)造函數(shù) employee(); /析構(gòu)函數(shù) void pay(); /計(jì)算月薪函數(shù) void promote(int); /升級函數(shù) void displayStatus(); /顯示人員信息 ;
25、class technician : public employee /技術(shù)人員類 private: float hourlyRate; /每小時酬金 int workHours; /當(dāng)月工作時數(shù) public: technician(); /構(gòu)造函數(shù) void pay(); /計(jì)算月薪函數(shù) void displayStatus(); /顯示人員信息;class salesman:virtual public employee /兼職推銷員類 protected: float CommRate; /按銷售額提取酬金的百分比 float sales; /當(dāng)月銷售額 public: salesma
26、n(); /構(gòu)造函數(shù) void pay(); /計(jì)算月薪函數(shù) void displayStatus(); /顯示人員信息;class manager:virtual public employee /經(jīng)理類 protected: float monthlyPay; /固定月薪數(shù) public: manager(); /構(gòu)造函數(shù) void pay(); /計(jì)算月薪函數(shù) void displayStatus(); /顯示人員信息 ;class salesmanager : public manager,public salesman /銷售經(jīng)理類 public: salesmanager ();
27、/構(gòu)造函數(shù) void pay(); /計(jì)算月薪函數(shù) void displayStatus(); /顯示人員信息 ;employee:employee() char namestr50; /輸人雇員姓名時首先臨時存放在namestr中coutnamestr; name=new charstrlen(namestr)+1;/動態(tài)申請用于存放姓名的內(nèi)存空間 strcpy(name, namestr); /將臨時存放的姓名復(fù)制到 name individualEmpNo= employeeNo+; /新輸人的員工,其編號為目前最大編號加1 grade=1; /級別初值為1accumPay=0.0; /
28、月薪總額初值為0 employee : employee() delete name ; /在析構(gòu)函數(shù)中刪除為存放姓名動態(tài)分配的內(nèi)存空間void employee : pay( ) /計(jì)算月薪,空函數(shù)void employee :promote(int increment) grade += increment ; /晉級,提升的級數(shù)由 increment指定void employee : displayStatus( ) /顯示人員信息,空函數(shù)technician : technician() hourlyRate=100; /每小時酬金100元void technician:pay() c
29、out請輸入nameworkHours; accumPay=hourlyRate* workHours; /計(jì)算月薪,按小時計(jì)酬 cout兼職技術(shù)人員name編號individualEmpNo 本月工資accumPayendl;void technician:displayStatus() cout“兼職技術(shù)人員”name“編號” individualEmpNo 級別為 grade 級,已付本月工資accumPayendl;salesman:salesman() CommRate=0.04; /銷售提成比例4void salesman:pay() cout請輸入namesales; accum
30、Pay=sales*CommRate; /月薪銷售提成 cout推銷員name編號individualEmpNo 本月工資accumPayendl;void salesman:displayStatus() cout推銷員name編號individualEmpNo 級別為grade級,已付本月工資accumPayendl;manager:manager() monthlyPay=8000; /固定月薪8000元void manager : pay() accumPay=monthlyPay; /月薪總額即固定月薪數(shù) cout經(jīng)理name編號individualEmpNo 本月工資accumPayendl;void manager : displayStatus() cout經(jīng)理name編號individualEmpNo 級別為grade級,已付本月工資accumPayendl;salesmanager :salesmanager()
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 互聯(lián)網(wǎng)金融產(chǎn)品說明
- 建筑結(jié)構(gòu)與設(shè)計(jì)技術(shù)作業(yè)指導(dǎo)書
- 人力資源顧問合同協(xié)議書
- 2025年安慶醫(yī)藥高等??茖W(xué)校單招職業(yè)傾向性考試題庫學(xué)生專用
- 2025年慶陽下載貨運(yùn)從業(yè)資格證模擬考試
- 市場調(diào)研結(jié)果分析報(bào)告
- 廠房物業(yè)委托合同
- 高中語文文學(xué)鑒賞
- 股票質(zhì)押合同協(xié)議書
- 農(nóng)民增收致富創(chuàng)業(yè)扶持手冊
- Wonderware InTouch:報(bào)警與事件處理機(jī)制技術(shù)教程.Tex.header
- 一把手講安全課件:提升全員安全意識
- CNAS實(shí)驗(yàn)室內(nèi)審檢查表
- 華為全屋智能試題
- Unit 3 Food and Culture Reading and thinking閱讀課教學(xué)設(shè)計(jì) 2023-2024學(xué)年人教版高中英語選擇性必修第二冊
- 數(shù)學(xué)大觀 知到智慧樹網(wǎng)課答案
- 小兒白血病飲食
- 2024年杭州科技職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫及答案解析
- JGJ79-2012 建筑地基處理技術(shù)規(guī)范
- LIMS實(shí)驗(yàn)室信息管理系統(tǒng)
- 柱塞泵工作原理動畫演示
評論
0/150
提交評論