十四对象间关系模型的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
十四.对象间关系模型的实现
C++语言支持对象模型中的的包容与继承(派生)关系,但对关联关系没有专用的语法支持。
⒈包容关系
①不透明包容
例:
#include
class A
{
int i;
public:
A(){i=0;}
A(int x):i(x){}
int operator!(){return i;}
};
class B
{
int j;
A *p;
public:
B(int x):j(x){p=new A[x];}
int operator!(){return j;}
void operator~(){for(int i=0;i }; void main() { B b(10); cout< ~b; } ②透明包容 例:向对象单向链表中插入已有的对象 #include class A { int 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 B { int 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=p; while(temp->GetNext())temp=temp->GetNext(); temp->SetNext(s); } } int operator!(){return j;} void operator~() { A* temp=p; while(temp) { cout< 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(); } ③类模板 当被包容的类的类型不确定时,可以用类模板来声明包容关系。其声明格式为: template class 体声明; 类模板参数表内可以声明多个模板参数,但若其内部存在的模板参是另外一个亦被声明为类模板的类,则务使之自左向右排放。 例1: template class A { T i; public: A(T x):i(x){} }; 例2: #include template class Array T *ar; public: Array(int c){ar=new T[c];} void init(int n,T x){ar[n]=x;} T& operator[](int n){return ar[n];} }; void main() { Array cout<<"Please input every element's value:"< for(int i=0;i<5;i++) { cout<<"No."< cin>>array[i]; } } ⒉继承(派生)关系 在C++语言中有专门的语句支持继承(派生)关系。其声明的语法格式为: public 类名i class 类名1:{成员声明}; private 类名k 例: class A { protected: int i; public: A(int x):i(x){} }; class B:public A int j; public: B(int x,int y):j(x),A(y){} }; void main() { B b(1,2); } 使用继承时的一些规则: ①基类成员被继承的可能性 ·public区的成员可以被部分或全部的继承; ·protected区的成员在本类对象中的功效与同类private区的成员相同且可以被部分或全部的继承; ·private区的成员不可能被继承; ②两种继承方式的作用 由于存在上述两种继承方式便可能导致派生类中彻底失去对其内部基类成员的存取权利: 基类A ↓以private方式继承 派生类B ↓以任何方式继承 派生类C (失去对其基类A的成员的存取权利)