十四對象間關(guān)系模型的實(shí)現(xiàn)_第1頁
十四對象間關(guān)系模型的實(shí)現(xiàn)_第2頁
十四對象間關(guān)系模型的實(shí)現(xiàn)_第3頁
十四對象間關(guān)系模型的實(shí)現(xiàn)_第4頁
十四對象間關(guān)系模型的實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、十四對象間關(guān)系模型的實(shí)現(xiàn)C+語言支持對象模型中的的包容與繼承(派生)關(guān)系,但對關(guān)聯(lián)關(guān)系沒有專用的語法支持。包容關(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ū)ο髥蜗蜴湵碇胁迦胍延械膶ο?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、定時,可以用類模板來聲明包容關(guān)系。其聲明格式為:template<class T>class 體聲明;類模板參數(shù)表內(nèi)可以聲明多個模板參數(shù),但若其內(nèi)部存在的模板參是另外一個亦被聲明為類模板的類,則務(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+語言中有專門的語句支持繼承(派生)關(guān)系。其聲明的語法格式為: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);使用繼承時的一些規(guī)則:基類成員被繼承的可能性·public區(qū)的成員可以被部分或全部的繼承;·protected區(qū)的成員在本類對象中的功效與同類private區(qū)的成員相同且可以被部分或全部的繼承;·private區(qū)的成員不可能被繼承;兩種繼承方式的作用派生類中以public方式繼承派生類中以

7、private方式繼承publicpublicprivateprotectedprotectedprivateprivate-由于存在上述兩種繼承方式便可能導(dǎo)致派生類中徹底失去對其內(nèi)部基類成員的存取權(quán)利:基類 A 以 private方式繼承 派生類B 以任何方式繼承 派生類 C (失去對其基類A的成員的存取權(quán)利)派生類不繼承基類的友元派生類對象中基類成員的初始化派生類對象在自身初始化時必須通過成員初始化表對其繼承的基類對象進(jìn)行初始化,且此種初始化要先于派生類對象本身的初始化。例: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)聲明了與基類同名的成員且又同時繼承了基類的同名成員的情景稱為成員覆蓋。在非多態(tà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+語法支持多重派生技術(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;派生類對象與基類的對

11、象成員之間的互相提取僅在以public方式繼承的情況下才能進(jìn)行這種對象成員間相互提取??赡艽嬖诘膬煞N情況:·已知一個基類對象而要提取其全部成員賦予另一個派生類對象;·已知一個派生類對象而要提取其內(nèi)含的基類對象的全部成員賦予另一個基類對象;例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();這樣提取得到的派生類對象內(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)鑒于基類是反映一個類家族全貌的Supclass,在其派生出的各個派生類對象中必然存在基類的成員(函數(shù))。若能使用基類的指針(或引用)指向其派生類對象,便可以利用對象當(dāng)前作用域的限制實(shí)現(xiàn) “以不變應(yīng)萬變”或者“以變應(yīng)變”的設(shè)想了。C+語言將實(shí)現(xiàn)此種設(shè)想的技術(shù)方法叫做虛擬函數(shù)。推論:虛擬函數(shù)應(yīng)當(dāng)是基類成員聲明的一種特殊形式。虛擬函數(shù)的聲明格式為:

15、virtual 類型 函數(shù)聲明體;使用虛擬函數(shù)的具體語法要領(lǐng)如下:·虛擬成員函數(shù)必須在基類中予以聲明;·虛擬成員函數(shù)可以在派生類中被覆蓋(重寫);·引用派生類中重寫的虛擬成員函數(shù)只能通過基類的指針或引用實(shí)現(xiàn);·若派生類中沒有再定義基類中已聲明的虛擬成員函數(shù),則指向該類的對象的指針或引用名調(diào)用該虛擬成員函數(shù)時總是調(diào)用距離其最近的一個基類中的虛擬成員函數(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 兩個特殊的虛擬函數(shù)純虛擬成員函數(shù)在C+語言中實(shí)現(xiàn)抽象類聲明的方法便是在基類中聲明一個以上的純虛擬成員函數(shù)。純虛擬成員函數(shù)的聲明格式為:virtual 返回類型 成員函數(shù)聲明=0;此外純虛擬成員函數(shù)還有下述特性:·純虛擬成員函數(shù)沒有定義體;·含有純虛擬成員函數(shù)的抽象類不能用來定義(生成)對象;·如果一個基類是抽象類,其派生類卻沒有重新聲明所繼承的基類中的純虛擬成員函數(shù),則這個派生類也是抽象類;·抽象類可以含有實(shí)際可用的成員函數(shù),但成員函數(shù)只能通過其派生類的對象才能被引用;例:#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òu)函數(shù)。當(dāng)使用虛擬函數(shù)技術(shù)引發(fā)一個派生類對象產(chǎn)生析構(gòu)時,通常只能撤消該派生類對象本身的成員部分(造成內(nèi)存碎片)。為避免發(fā)生此類情形,C+語言允許將基類中的析構(gòu)函數(shù)虛化,隨稱之為虛擬析構(gòu)函數(shù)。例:#include<iostream.h>class Aprotected:int i;public:A(in

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論