版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、十四對(duì)象間關(guān)系模型的實(shí)現(xiàn)C+語(yǔ)言支持對(duì)象模型中的的包容與繼承(派生)關(guān)系,但對(duì)關(guān)聯(lián)關(guān)系沒有專用的語(yǔ)法支持。包容關(guān)系 不透明包容例:#include<iostream.h>class Aint i;public:A()i=0;A(int x):i(x)int operator!()return i;class Bint j;A *p;public:B(int x):j(x)p=new Ax;int operator!()return j;void operator()for(int i=0;i<j;i+)cout<<!pi;void main()B b(10);co
2、ut<<!b<<endl;b; 透明包容例:向?qū)ο髥蜗蜴湵碇胁迦胍延械膶?duì)象#include<iostream.h>class Aint i;A *next;public:A(int x,A* s=NULL):i(x),next(s)A* GetNext()return next;void SetNext(A* s)next=s;int operator!()return i;class Bint j;A *p;public:B(int x,A* s=NULL):j(x),p(s)void Insert(A* s)if(!p)p=s;else A* temp=
3、p;while(temp->GetNext()temp=temp->GetNext();temp->SetNext(s);int operator!()return j;void operator()A* temp=p;while(temp)cout<<!(*temp)<<endl;temp=temp->GetNext();void main()A a1(0),a2(1),a3(2);B b(10,&a1);b.Insert(&a2);b.Insert(&a3);!a1;b;cin.get();類模板當(dāng)被包容的類的類型不確
4、定時(shí),可以用類模板來(lái)聲明包容關(guān)系。其聲明格式為:template<class T>class 體聲明;類模板參數(shù)表內(nèi)可以聲明多個(gè)模板參數(shù),但若其內(nèi)部存在的模板參是另外一個(gè)亦被聲明為類模板的類,則務(wù)使之自左向右排放。例1:template<class T>class AT i;public:A(T x):i(x);例2:#include<iostream.h>template<class T>class Array T *ar; public:Array(int c)ar=new Tc;void init(int n,T x)arn=x;T&
5、; operator(int n)return arn;void main() Array<int> array(5); cout<<"Please input every element's value:"<<endl; for(int i=0;i<5;i+) cout<<"No."<<i+1<<':' cin>>arrayi; 繼承(派生)關(guān)系在C+語(yǔ)言中有專門的語(yǔ)句支持繼承(派生)關(guān)系。其聲明的語(yǔ)法格式為:public 類名iclass
6、 類名1:成員聲明;private類名k例:class Aprotected:int i;public:A(int x):i(x);class B:public Aint j;public:B(int x,int y):j(x),A(y);void main()B b(1,2);使用繼承時(shí)的一些規(guī)則:基類成員被繼承的可能性·public區(qū)的成員可以被部分或全部的繼承;·protected區(qū)的成員在本類對(duì)象中的功效與同類private區(qū)的成員相同且可以被部分或全部的繼承;·private區(qū)的成員不可能被繼承;兩種繼承方式的作用派生類中以public方式繼承派生類中以
7、private方式繼承publicpublicprivateprotectedprotectedprivateprivate-由于存在上述兩種繼承方式便可能導(dǎo)致派生類中徹底失去對(duì)其內(nèi)部基類成員的存取權(quán)利:基類 A 以 private方式繼承 派生類B 以任何方式繼承 派生類 C (失去對(duì)其基類A的成員的存取權(quán)利)派生類不繼承基類的友元派生類對(duì)象中基類成員的初始化派生類對(duì)象在自身初始化時(shí)必須通過(guò)成員初始化表對(duì)其繼承的基類對(duì)象進(jìn)行初始化,且此種初始化要先于派生類對(duì)象本身的初始化。例:class Aprotected:int i;public:A(int x):i(x);class B:public
8、 Aint j;public:B(int x,int y):j(x),A(y);void main()B b(1,2);成員覆蓋( Member overridden)若在派生類內(nèi)聲明了與基類同名的成員且又同時(shí)繼承了基類的同名成員的情景稱為成員覆蓋。在非多態(tài)的條件下對(duì)被覆蓋的成員的引用是通過(guò)對(duì)象作用域來(lái)確定的。例:#include<iostream.h>class Aprotected:int i;public:A(int x=0):i(x)int operator!()return i;class B:public Aprotected:int i;public:B(int x=
9、0,int y=0):i(x),A(y)int operator!()return i;int operator()return !*(A*)this;void main()B b(1,2);cout<<!b<<endl;cout<<b<<endl;cin.get();多重派生的實(shí)現(xiàn)C+語(yǔ)法支持多重派生技術(shù)。其聲明格式為:public 類名i,public 類名j,class 類名1:成員聲明;private類名k,private類名m,同單一派生一樣,多重派生也要遵守上述規(guī)則或約定。例:#include<iostream.h>cla
10、ss Aint i;public:A(int x):i(x)void operator!()cout<<i<<endl;class Bprotected:int i;public:B(int x):i(x);class C:public A,public Bint i;public:C(int x,int y,int z):i(x),B(y),A(z)void operator!()cout<<i<<endl<<B:i<<endl;!*(A*)this;void main()C c(1,2,3);!c;派生類對(duì)象與基類的對(duì)
11、象成員之間的互相提取僅在以public方式繼承的情況下才能進(jìn)行這種對(duì)象成員間相互提取??赡艽嬖诘膬煞N情況:·已知一個(gè)基類對(duì)象而要提取其全部成員賦予另一個(gè)派生類對(duì)象;·已知一個(gè)派生類對(duì)象而要提取其內(nèi)含的基類對(duì)象的全部成員賦予另一個(gè)基類對(duì)象;例1:#include<iostream.h>class Aint i;public:A(int x):i(x)void Increase_One()i+;void operator!()cout<<"i="<<i<<endl;class B:public Aint l;p
12、ublic:B():A(0)l=0;Increase_One();void operator!()!*(A*)this;cout<<"L="<<l<<endl;void main()/最后的顯示結(jié)果為:A a(1);/L=1,L=6618680B *b0=(B*)&a,&b1=(B&)a;/I=1,L=6618680!*b0;!b1;/其中的L值是不確定的cin.get();這樣提取得到的派生類對(duì)象內(nèi)的本類作用域?qū)嶋H上根本不存在。因而要謹(jǐn)慎應(yīng)用。例2:#include<iostream.h>class
13、Aint i;public:A(int x):i(x)void operator!()cout<<"I="<<i<<endl;void Increase_One()i+;class B:public Aint l;public:B(int n=0):A(0),l(n)Increase_One();void operator!()!*(A*)this;cout<<"L="<<l<<endl;void main()B b1(5);/最后的顯示結(jié)果為:A a1=b1;/ I=1A* a2=
14、new B(4);/ I=1A &a3=b1,*a4=&b1;/ I=1!a1;!*a2;!a3;!*a4;/ I=1多態(tài)(Polymorphism)與抽象類(Abstract Classes) 虛擬函數(shù)(virtual function)鑒于基類是反映一個(gè)類家族全貌的Supclass,在其派生出的各個(gè)派生類對(duì)象中必然存在基類的成員(函數(shù))。若能使用基類的指針(或引用)指向其派生類對(duì)象,便可以利用對(duì)象當(dāng)前作用域的限制實(shí)現(xiàn) “以不變應(yīng)萬(wàn)變”或者“以變應(yīng)變”的設(shè)想了。C+語(yǔ)言將實(shí)現(xiàn)此種設(shè)想的技術(shù)方法叫做虛擬函數(shù)。推論:虛擬函數(shù)應(yīng)當(dāng)是基類成員聲明的一種特殊形式。虛擬函數(shù)的聲明格式為:
15、virtual 類型 函數(shù)聲明體;使用虛擬函數(shù)的具體語(yǔ)法要領(lǐng)如下:·虛擬成員函數(shù)必須在基類中予以聲明;·虛擬成員函數(shù)可以在派生類中被覆蓋(重寫);·引用派生類中重寫的虛擬成員函數(shù)只能通過(guò)基類的指針或引用實(shí)現(xiàn);·若派生類中沒有再定義基類中已聲明的虛擬成員函數(shù),則指向該類的對(duì)象的指針或引用名調(diào)用該虛擬成員函數(shù)時(shí)總是調(diào)用距離其最近的一個(gè)基類中的虛擬成員函數(shù)。·構(gòu)造函數(shù)不得聲明為虛擬;例:#include<iostream.h>class A protected: int i; public: A(int x):i(x) virtual v
16、oid operator!()cout<<"I="<<i<<endl;class B:public A int l; public: B(int n=0):A(0),l(n)i+; void operator!()cout<<"I="<<i<<" , L="<<l<<endl;void main() B b(5); A a(2); /最后的顯示結(jié)果為: A *ab=&a;!*ab; /I=2 ab=&b;!*ab; /I=1
17、,L=5 A &ba=b;!ba; /I=1,L=5 兩個(gè)特殊的虛擬函數(shù)純虛擬成員函數(shù)在C+語(yǔ)言中實(shí)現(xiàn)抽象類聲明的方法便是在基類中聲明一個(gè)以上的純虛擬成員函數(shù)。純虛擬成員函數(shù)的聲明格式為:virtual 返回類型 成員函數(shù)聲明=0;此外純虛擬成員函數(shù)還有下述特性:·純虛擬成員函數(shù)沒有定義體;·含有純虛擬成員函數(shù)的抽象類不能用來(lái)定義(生成)對(duì)象;·如果一個(gè)基類是抽象類,其派生類卻沒有重新聲明所繼承的基類中的純虛擬成員函數(shù),則這個(gè)派生類也是抽象類;·抽象類可以含有實(shí)際可用的成員函數(shù),但成員函數(shù)只能通過(guò)其派生類的對(duì)象才能被引用;例:#include&l
18、t;iostream.h>class Aprotected:int i;public:A(int x):i(x)virtual int operator!()=0;class B:public Aint l;public:B(int x,int y):l(x),A(y)int operator!()return i+l;void main()A* p=new B(1,2);cout<<!*p<<endl;虛擬析構(gòu)函數(shù)一個(gè)類只有一個(gè)析構(gòu)函數(shù)。當(dāng)使用虛擬函數(shù)技術(shù)引發(fā)一個(gè)派生類對(duì)象產(chǎn)生析構(gòu)時(shí),通常只能撤消該派生類對(duì)象本身的成員部分(造成內(nèi)存碎片)。為避免發(fā)生此類情形,C+語(yǔ)言允許將基類中的析構(gòu)函數(shù)虛化,隨稱之為虛擬析構(gòu)函數(shù)。例:#include<iostream.h>class Aprotected:int i;public:A(in
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)生森林消防安全
- 康復(fù)醫(yī)學(xué)的預(yù)防
- 安全寵物:可愛背后的隱患
- 2025裝飾公司裝修合同書
- 2025商業(yè)合作合同范文
- 2025茶葉買賣合同的范本
- 酒店經(jīng)營(yíng)模式的創(chuàng)新之道
- 財(cái)務(wù)用戶滿意度調(diào)查計(jì)劃
- 服裝紡織行業(yè)安全管理實(shí)踐
- 零售行業(yè)電話客服工作總結(jié)
- 2025年度愛讀書學(xué)長(zhǎng)主辦的讀書挑戰(zhàn)賽組織合同
- 2024年滄州經(jīng)濟(jì)開發(fā)區(qū)招聘社區(qū)工作者筆試真題
- 中外美術(shù)史試題及答案
- 2025年安徽省銅陵市公安局交警支隊(duì)招聘交通輔警14人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 公共政策分析 課件 第8章政策評(píng)估;第9章政策監(jiān)控
- 人教版八年級(jí)上學(xué)期物理期末復(fù)習(xí)(壓軸60題40大考點(diǎn))
- 企業(yè)環(huán)保知識(shí)培訓(xùn)課件
- 2024年度管理評(píng)審報(bào)告
- 暨南大學(xué)《微觀經(jīng)濟(jì)學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 醫(yī)藥銷售合規(guī)培訓(xùn)
- DB51-T 5038-2018 四川省地面工程施工工藝標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論