欢迎来到天天文库
浏览记录
ID:55505979
大小:183.50 KB
页数:15页
时间:2020-05-15
《十四.对象关系模型的实现.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、十四.对象间关系模型的实现C++语言支持对象模型中的的包容与继承(派生)关系,但对关联关系没有专用的语法支持。⒈包容关系①不透明包容例:#includeclassA{inti;public:A(){i=0;}A(intx):i(x){}intoperator!(){returni;}};classB{intj;A*p;public:B(intx):j(x){p=newA[x];}intoperator!(){returnj;}voidoperator~(){for(inti=0;i2、++)cout<classA{inti;A*next;public:A(intx,A*s=NULL):i(x),next(s){}A*GetNext(){returnnext;}voidSetNext(A*s){next=s;}intoperator!(){returni;}};classB{intj;A*p;public:B(int3、x,A*s=NULL):j(x),p(s){}voidInsert(A*s){if(!p)p=s;else{A*temp=p;while(temp->GetNext())temp=temp->GetNext();temp->SetNext(s);}}intoperator!(){returnj;}voidoperator~(){A*temp=p;while(temp){15cout<GetNext();}}};voidmain(){Aa1(0),a2(1),a4、3(2);Bb(10,&a1);b.Insert(&a2);b.Insert(&a3);!a1;~b;cin.get();}③类模板当被包容的类的类型不确定时,可以用类模板来声明包容关系。其声明格式为:templateclass体声明;类模板参数表内可以声明多个模板参数,但若其内部存在的模板参是另外一个亦被声明为类模板的类,则务使之自左向右排放。例1:templateclassA{Ti;public:A(Tx):i(x){}};例2:#includetemp5、lateclassArray15{T*ar;public:Array(intc){ar=newT[c];}voidinit(intn,Tx){ar[n]=x;}T&operator[](intn){returnar[n];}};voidmain(){Arrayarray(5);cout<<"Pleaseinputeveryelement'svalue:"<>array[i];}}⒉继承6、(派生)关系在C++语言中有专门的语句支持继承(派生)关系。其声明的语法格式为:public类名iclass类名1:{成员声明};private类名k例:classA{protected:inti;public:A(intx):i(x){}};classB:publicA15{intj;public:B(intx,inty):j(x),A(y){}};voidmain(){Bb(1,2);}使用继承时的一些规则:①基类成员被继承的可能性·public区的成员可以被部分或全部的继承;·protected区的成员在本7、类对象中的功效与同类private区的成员相同且可以被部分或全部的继承;·private区的成员不可能被继承;②两种继承方式的作用派生类中以public方式继承派生类中以private方式继承publicpublicprivateprotectedprotectedprivateprivate--由于存在上述两种继承方式便可能导致派生类中彻底失去对其内部基类成员的存取权利:基类A↓以private方式继承派生类B↓以任何方式继承派生类C(失去对其基类A的成员的存取权利)15③派生类不继承基类的友元④派生类对象中基8、类成员的初始化派生类对象在自身初始化时必须通过成员初始化表对其继承的基类对象进行初始化,且此种初始化要先于派生类对象本身的初始化。例:classA{protected:inti;public:A(intx):i(x){}};classB:publicA{intj;public:B(intx,inty):j(x),A(y){}};voidmain(){Bb(1,2);}⑤成
2、++)cout<classA{inti;A*next;public:A(intx,A*s=NULL):i(x),next(s){}A*GetNext(){returnnext;}voidSetNext(A*s){next=s;}intoperator!(){returni;}};classB{intj;A*p;public:B(int
3、x,A*s=NULL):j(x),p(s){}voidInsert(A*s){if(!p)p=s;else{A*temp=p;while(temp->GetNext())temp=temp->GetNext();temp->SetNext(s);}}intoperator!(){returnj;}voidoperator~(){A*temp=p;while(temp){15cout<GetNext();}}};voidmain(){Aa1(0),a2(1),a
4、3(2);Bb(10,&a1);b.Insert(&a2);b.Insert(&a3);!a1;~b;cin.get();}③类模板当被包容的类的类型不确定时,可以用类模板来声明包容关系。其声明格式为:templateclass体声明;类模板参数表内可以声明多个模板参数,但若其内部存在的模板参是另外一个亦被声明为类模板的类,则务使之自左向右排放。例1:templateclassA{Ti;public:A(Tx):i(x){}};例2:#includetemp
5、lateclassArray15{T*ar;public:Array(intc){ar=newT[c];}voidinit(intn,Tx){ar[n]=x;}T&operator[](intn){returnar[n];}};voidmain(){Arrayarray(5);cout<<"Pleaseinputeveryelement'svalue:"<>array[i];}}⒉继承
6、(派生)关系在C++语言中有专门的语句支持继承(派生)关系。其声明的语法格式为:public类名iclass类名1:{成员声明};private类名k例:classA{protected:inti;public:A(intx):i(x){}};classB:publicA15{intj;public:B(intx,inty):j(x),A(y){}};voidmain(){Bb(1,2);}使用继承时的一些规则:①基类成员被继承的可能性·public区的成员可以被部分或全部的继承;·protected区的成员在本
7、类对象中的功效与同类private区的成员相同且可以被部分或全部的继承;·private区的成员不可能被继承;②两种继承方式的作用派生类中以public方式继承派生类中以private方式继承publicpublicprivateprotectedprotectedprivateprivate--由于存在上述两种继承方式便可能导致派生类中彻底失去对其内部基类成员的存取权利:基类A↓以private方式继承派生类B↓以任何方式继承派生类C(失去对其基类A的成员的存取权利)15③派生类不继承基类的友元④派生类对象中基
8、类成员的初始化派生类对象在自身初始化时必须通过成员初始化表对其继承的基类对象进行初始化,且此种初始化要先于派生类对象本身的初始化。例:classA{protected:inti;public:A(intx):i(x){}};classB:publicA{intj;public:B(intx,inty):j(x),A(y){}};voidmain(){Bb(1,2);}⑤成
此文档下载收益归作者所有