十四对象间关系模型的实现_第1页
十四对象间关系模型的实现_第2页
十四对象间关系模型的实现_第3页
十四对象间关系模型的实现_第4页
十四对象间关系模型的实现_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、十四对象间关系模型的实现C+语言支持对象模型中的的包容与继承(派生)关系,但对关联关系没有专用的语法支持。包容关系 不透明包容例:#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; 透明包容例:向对象单向链表中插入已有的对象#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();类模板当被包容的类的类型不确

4、定时,可以用类模板来声明包容关系。其声明格式为:template<class T>class 体声明;类模板参数表内可以声明多个模板参数,但若其内部存在的模板参是另外一个亦被声明为类模板的类,则务使之自左向右排放。例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; 继承(派生)关系在C+语言中有专门的语句支持继承(派生)关系。其声明的语法格式为: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);使用继承时的一些规则:基类成员被继承的可能性·public区的成员可以被部分或全部的继承;·protected区的成员在本类对象中的功效与同类private区的成员相同且可以被部分或全部的继承;·private区的成员不可能被继承;两种继承方式的作用派生类中以public方式继承派生类中以

7、private方式继承publicpublicprivateprotectedprotectedprivateprivate-由于存在上述两种继承方式便可能导致派生类中彻底失去对其内部基类成员的存取权利:基类 A 以 private方式继承 派生类B 以任何方式继承 派生类 C (失去对其基类A的成员的存取权利)派生类不继承基类的友元派生类对象中基类成员的初始化派生类对象在自身初始化时必须通过成员初始化表对其继承的基类对象进行初始化,且此种初始化要先于派生类对象本身的初始化。例: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)若在派生类内声明了与基类同名的成员且又同时继承了基类的同名成员的情景称为成员覆盖。在非多态的条件下对被覆盖的成员的引用是通过对象作用域来确定的。例:#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();多重派生的实现C+语法支持多重派生技术。其声明格式为:public 类名i,public 类名j,class 类名1:成员声明;private类名k,private类名m,同单一派生一样,多重派生也要遵守上述规则或约定。例:#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方式继承的情况下才能进行这种对象成员间相互提取。可能存在的两种情况:·已知一个基类对象而要提取其全部成员赋予另一个派生类对象;·已知一个派生类对象而要提取其内含的基类对象的全部成员赋予另一个基类对象;例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()/最后的显示结果为:A a(1);/L=1,L=6618680B *b0=(B*)&a,&b1=(B&)a;/I=1,L=6618680!*b0;!b1;/其中的L值是不确定的cin.get();这样提取得到的派生类对象内的本类作用域实际上根本不存在。因而要谨慎应用。例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);/最后的显示结果为:A a1=b1;/ I=1A* a2=

14、new B(4);/ I=1A &a3=b1,*a4=&b1;/ I=1!a1;!*a2;!a3;!*a4;/ I=1多态(Polymorphism)与抽象类(Abstract Classes) 虚拟函数(virtual function)鉴于基类是反映一个类家族全貌的Supclass,在其派生出的各个派生类对象中必然存在基类的成员(函数)。若能使用基类的指针(或引用)指向其派生类对象,便可以利用对象当前作用域的限制实现 “以不变应万变”或者“以变应变”的设想了。C+语言将实现此种设想的技术方法叫做虚拟函数。推论:虚拟函数应当是基类成员声明的一种特殊形式。虚拟函数的声明格式为:

15、virtual 类型 函数声明体;使用虚拟函数的具体语法要领如下:·虚拟成员函数必须在基类中予以声明;·虚拟成员函数可以在派生类中被覆盖(重写);·引用派生类中重写的虚拟成员函数只能通过基类的指针或引用实现;·若派生类中没有再定义基类中已声明的虚拟成员函数,则指向该类的对象的指针或引用名调用该虚拟成员函数时总是调用距离其最近的一个基类中的虚拟成员函数。·构造函数不得声明为虚拟;例:#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); /最后的显示结果为: A *ab=&a;!*ab; /I=2 ab=&b;!*ab; /I=1

17、,L=5 A &ba=b;!ba; /I=1,L=5 两个特殊的虚拟函数纯虚拟成员函数在C+语言中实现抽象类声明的方法便是在基类中声明一个以上的纯虚拟成员函数。纯虚拟成员函数的声明格式为:virtual 返回类型 成员函数声明=0;此外纯虚拟成员函数还有下述特性:·纯虚拟成员函数没有定义体;·含有纯虚拟成员函数的抽象类不能用来定义(生成)对象;·如果一个基类是抽象类,其派生类却没有重新声明所继承的基类中的纯虚拟成员函数,则这个派生类也是抽象类;·抽象类可以含有实际可用的成员函数,但成员函数只能通过其派生类的对象才能被引用;例:#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;虚拟析构函数一个类只有一个析构函数。当使用虚拟函数技术引发一个派生类对象产生析构时,通常只能撤消该派生类对象本身的成员部分(造成内存碎片)。为避免发生此类情形,C+语言允许将基类中的析构函数虚化,随称之为虚拟析构函数。例:#include<iostream.h>class Aprotected:int i;public:A(in

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论