十四对象间关系模型的实现
- 格式:doc
- 大小:183.50 KB
- 文档页数:15
1 十四.对象间关系模型的实现 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; }
② 透明包容 2
例:向对象单向链表中插入已有的对象 #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) { 3
cout
{ 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 array(5); cout<<"Please input every element's value:"
在C++语言中有专门的语句支持继承(派生)关系。其声明的语法格式为: public 类名i class 类名1: {成员声明}; private 类名k
例: class A { protected: int i; public: A(int x):i(x){} }; class B:public A 5
{ int j; public: B(int x,int y):j(x),A(y){} }; void main() { B b(1,2); } 使用继承时的一些规则:
①基类成员被继承的可能性
·public区的成员可以被部分或全部的继承; ·protected区的成员在本类对象中的功效与同类private区的成员相同且可以被部分或全部的继承; ·private区的成员不可能被继承; ②两种继承方式的作用 派生类中以public方式继承 派生类中以private方式继承 public public private protected protected private private - -
由于存在上述两种继承方式便可能导致派生类中彻底失去对其
内部基类成员的存取权利: 基类 A ↓ 以 private方式继承 派生类B ↓ 以任何方式继承 派生类 C (失去对其基类A的成员的存取权利) 6
③派生类不继承基类的友元 ④派生类对象中基类成员的初始化 派生类对象在自身初始化时必须通过成员初始化表对其继承的基类对象进行初始化,且此种初始化要先于派生类对象本身的初始化。 例: 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);
}
⑤成员覆盖( Member overridden) 若在派生类内声明了与基类同名的成员且又同时继承了基类的同名成员的情景称为成员覆盖。在非多态的条件下对被覆盖的成员的引用是通过对象作用域来确定的。 例: 7
#include class A { protected: int i; public: A(int x=0):i(x){} int operator!(){return i;} }; class B:public A { protected: int i; public: B(int x=0,int y=0):i(x),A(y){} int operator!(){return i;} int operator~(){return !*(A*)this;} }; void main() { B b(1,2); cout } ⑥多重派生的实现 C++语法支持多重派生技术。其声明格式为: public 类名i,public 类名j,… class 类名1: {成员声明}; private 类名k,private类名m,… 同单一派生一样,多重派生也要遵守上述规则或约定。 例: 8 #include class A { int i; public: A(int x):i(x){} void operator!(){cout<}; class B { protected: int i; public: B(int x):i(x){} }; class C:public A,public B { int i; public: C(int x,int y,int z):i(x),B(y),A(z){} void operator!(){cout<}; void main() { C c(1,2,3); !c; } ⑦派生类对象与基类的对象成员之间的互相提取 仅在以public方式继承的情况下才能进行这种对象成员间相互提取。可能存在的两种情况: ·已知一个基类对象而要提取其全部成员赋予另一个派生类对象; ·已知一个派生类对象而要提取其内含的基类对象的全部成员赋予另 9 一个基类对象; 例1: #include class A { int i; public: A(int x):i(x){} void Increase_One(){i++;} void operator!(){cout<<"i="<}; class B:public A { int l; public: B():A(0){l=0;Increase_One();} void operator!(){!*(A*)this;cout<<"L="<}; void main() { //最后的显示结果为: A a(1); //L=1,L=6618680 B *b0=(B*)&a,&b1=(B&)a; //I=1,L=6618680 !*b0;!b1; //其中的L值是不确定的 cin.get(); } 这样提取得到的派生类对象内的本类作用域实际上根本不存在。因而要谨慎应用。 例2: #include class A { int i; public: