()外部函数(main)对私有派生类继承来的成员的访问 私有派生时,基类的所有成员在派生类中都成为私有成员,外部函 数不能访问。 例42 void maino #include <iostream.h> i derived obj; class baset ∥定义基类 obj. setx((10);∥出错 Int x; 0bety(20);∥合法 public obj. showxO;∥出错 void setx(int n)x=n;) obj. showy;∥合法 void showxoi cout <<x<< end; class derived: private base{/定义私有派生类 nt y; public void sety(int n)i void showy {cout≤<y<end;}
(2) 外部函数(main)对私有派生类继承来的成员的访问 私有派生时,基类的所有成员在派生类中都成为私有成员,外部函 数不能访问。 例4.2 #include <iostream.h> class base{ //定义基类 int x; public: void setx(int n) { x=n; } void showx() { cout << x << endl; } }; class derived : private base { //定义私有派生类 int y; public: void sety(int n) { y=n; } void showy() { cout << y << endl; } }; void main() { derived obj; obj.setx(10); //出错 obj.sety(20); //合法 obj.showx(); //出错 obj.showy(); //合法 } 6
2.公有派生 在公有派生中,基类的私有成员对派生类来说仍是基类的私有 成员,只能通过基类的公有成员函数访问(相当于可访问性保持 不变),不允许外部函数和派生类的成员函数直接访问。基类中 的公有成员相当于派生类的公有成员,外部函数和派生类的成员 函数可直接访问。 例43 void maino #include <iostream. h> i derived obj lass base ∥定义基类 Int x; obj. setx((10);∥合法 public obj. sety(20);∥合法 void setx (intn)xen; obj. showN;∥合法 void show(0{ cout <<x<< endl;} obj. showy;∥合法 }; lass derived: public base i定义公有派生k C int y public void sety(int n)i y=n; 3 void showy {cout≤<y<end;}
2. 公有派生 在公有派生中,基类的私有成员对派生类来说仍是基类的私有 成员,只能通过基类的公有成员函数访问(相当于可访问性保持 不变),不允许外部函数和派生类的成员函数直接访问。基类中 的公有成员相当于派生类的公有成员,外部函数和派生类的成员 函数可直接访问。 例4.3 #include <iostream.h> class base{ //定义基类 int x; public: void setx(int n) { x=n; } void showx() { cout << x << endl; } }; class derived : public base {//定义公有派生类 int y; public: void sety(int n) { y=n; } void showy() { cout << y << endl; } }; void main() { derived obj; obj.setx(10); //合法 obj.sety(20); //合法 obj.showx(); //合法 obj.showy(); //合法 } 7
在作类派生时,可能导致几个类使用同一函数名或变量名,这 就会产生二义性。 如 class x{ 8 #include <iostream. h> public: int f0; void main( Xa class y: publica i Ybs public: int fO int i=a int go it j=bfO cout <<i="<<i<< endl; cout <<j=<<j<< endl 这里bf(用的是Y类的f0还是X类的f0?用的是Y类的 fO,编译器会自动从继承底向上搜索,这叫作支配规则。如果一 定要用X类的fO,则可写成bX:f0;X:叫作用域分辨符
在作类派生时,可能导致几个类使用同一函数名或变量名,这 就会产生二义性。 如 class X { public: int f(); }; class Y : public X { public: int f(); int g(); }; 这里 b.f() 用的是Y 类的 f() 还是 X 类的 f()? 用的是Y 类的 f(),编译器会自动从继承底向上搜索,这叫作支配规则。如果一 定要用 X 类的 f(),则可写成 b.X::f(); X::叫作用域分辨符。 #include <iostream.h> void main( ) { X a; Y b; int i=a.f(); int j=b.f(); cout << "i=" << i << endl; cout << "j=" << j << endl; } 8
表4.1公有派生和私有派生的访问特性 基类成员 基类私有成员 基类公有成员 基类保护成员 派生方式 private public private public private public 派生类成员|不可访问不可访问可访问可访问可访问可访问 外部函数不可访问不可访问不可访间可访问|不可访问不可访问
表4.1公有派生和私有派生的访问特性 基类成员 基类私有成员 基类公有成员 基类保护成员 派生方式 private public private public private public 派生类成员 外部函数 不可访问 不可访问 不可访问 不可访问 可访问 不可访问 可访问 可访问 可访问 不可访问 可访问 不可访问 9
413基类的保护成员作用 无论私有派生还是公有派生,派生类无权访问它的基类的私有 成员。派生类要想访问它的基类的私有成员,只能通过调用基类 的成员函数的方式实现,对这有时会带来不便。C十+还提供 种访问属性 protected保护性成员。基类的保护成员具有私有成 员和公有成员双重角色:对自已的对象而言它是私有成员,即不 能被其他程序或函数访问(只能被类中的成员函数访问);而对派 生类而言,它又相当于是基类的公有成员。当公有派生时,基类 的保护成员在派生类也为保护成员。当私有派生时,相当于派生 类的私有成员,派生类的成员函数可以访问它
4.1.3 基类的保护成员作用 无论私有派生还是公有派生,派生类无权访问它的基类的私有 成员。派生类要想访问它的基类的私有成员,只能通过调用基类 的成员函数的方式实现,对这有时会带来不便。C++还提供一 种访问属性protected 保护性成员。基类的保护成员具有私有成 员和公有成员双重角色:对自已的对象而言它是私有成员,即不 能被其他程序或函数访问(只能被类中的成员函数访问);而对派 生类而言,它又相当于是基类的公有成员。当公有派生时,基类 的保护成员在派生类也为保护成员。当私有派生时,相当于派生 类的私有成员,派生类的成员函数可以访问它。 10