例44保护成员的例子 void main0 #include <iostream. h class samp i samp obj(20, 30); int a: obja=88;/排法,类的私有成员不能对外 protected obib-=99;/非法,类的保护成员相当于私 int b: public: 有成员不能对外 int c: obi.c=50∥合法,类的公有成员能对外 samp(int n, int m cout<< obj. geta(<’’; a=n;b=m;}∥构造函数 int geta return a; cout < obj- getb0 <<<<obj. c<<endl int getbot return b;
void main () { samp obj(20,30); obj.a=88; //非法,类的私有成员不能对外 obj.b=99; //非法,类的保护成员相当于私 有成员不能对外 obj.c=50 //合法,类的公有成员能对外 cout << obj.geta() << ' '; cout << obj.getb() << ' ' <<obj.c<<endl; } 例4.4 保护成员的例子 #include <iostream.h> class samp{ int a; protected: int b; public: int c; samp(int n, int m ) { a=n; b=m; } //构造函数 int geta() { return a; } int getb() { return b; } }; 11
例4.5保护成员被公有派生后的例子 # include≤ iostream. h> class base i protected: inta,b;/保护成员 public: void setab(int n, int m) a=n; b=m;) class derive: public base i int c. public: void setc(intn)c=n; void showabc(O∥a,b相当于派生类的私有成员,成员函数可访间 i cout <<a<< k<<b<<k<<c<<end; j void maino i derive obj; obj. stab(2,4);/基类的公有成员相当于派生类的公有成员可被外 界访问 obj. setc(3); obj. showabco;
例4.5 保护成员被公有派生后的例子 #include <iostream.h> class base { protected: int a,b; //保护成员 public: void setab(int n, int m) { a=n; b=m; } }; class derive:public base { int c; public: void setc(int n) { c=n; } void showabc()//a,b 相当于派生类的私有成员,成员函数可访问 { cout <<a<<' '<<b<<' '<<c<<endl; } }; void main() { derive obj; obj.setab(2,4); //基类的公有成员相当于派生类的公有成员,可被外 界访问 obj.setc(3); obj.showabc(); } 12
例4.6保护成员被私有派生后的例子 #include <iostream. h> class base class derive: private base i protected: protected: inta;/保护成员 It b public: public: void seta(int sa)( a=sa;) void setb(int sb b=sb;) }; void main( class derive: public derive i i base opl; nt c: public: opl.seta(1) void setc(int sc)c=sc; derive opi void showo op2.setb(2); {cout<<"a="<a<<endl;∥非法,保护成员a被 deri derive op3 成为 derive的私有成员, derie2中 cout<“b-”<<b<end;∥合法 op3. setc(3) cout<“c=”<<c<end;}∥合法 op3. showO };
例4.6 保护成员被私有派生后的例子 #include <iostream.h> class base { protected: int a; //保护成员 public: void seta(int sa) { a=sa; } }; class derive2:public derive1 { int c; public: void setc(int sc) { c=sc; } void show() { cout<<"a="<<a<<endl; //非法,保护成员a 被derive1私有派生后 成为derive1的私有成员,dervie2中不能//直接访问 cout<<“b=”<<b<<endl; //合法 cout<<“c=”<<c<<endl; } //合法 }; void main() { base op1; op1.seta(1); derive1 op2; op2.setb(2); derive2 op3; op3.setc(3); op3.show(); } 13 class derive1:private base { protected: int b; public: void setb(int sb) { b=sb; } };
表4.2基类成员在派生类中和外部函数中的访问权限 派生方式基类中的访问权限派生类中的访问权限 public public publlC protected protected (公有派生) private private public private private protected private (私有派生) private
表4.2 基类成员在派生类中和外部函数中的访问权限 派 生 方 式 基类中的访问权限 派生类中的访问权限 public (公有派生) public protected private public protected private private (私有派生) public protected private private private 14
保护成员的这种性质还可传播给派生的派生。 15 例保护成员的性质传播给派生的派生的例子 class B ase t int value; protected: void Set value(intv) value=v;) class First: public Base int total: public C void SetTotal(int t) i total-t; Setvalue(t);/使用基类的保护成员,相当于本类的保护成员 class Second public First t int count; public: void setcount(int c) Set value(c)l;/使用基类的保护成员,相当于本类的保护成员
保护成员的这种性质还可传播给派生的派生。 例 保护成员的性质传播给派生的派生的例子。 class Base { int value; protected: void SetValue(int v) { value=v; } }; class First : public Base { int total; public: void SetTotal(int t) { total=t; SetValue(t); //使用基类的保护成员,相当于本类的保护成员 } }; class Second : public First { int count; public: void SetCount(int c) { count=c; SetValue(c); //使用基类的保护成员,相当于本类的保护成员 } }; 15