(2)外部函数(main)对私有派生类继承来的成员的访问 私有派生时,基类的所有成员在派生类中都成为私有成员,外部函 数不能访问。 例42 void main #include <iostream. h> i derived obj; class base ∥定义基类 obj.setx(10);∥出错 int x; obj.sety(20);∥合法 public: obj. showxo;∥出错 void setx(intn)ix-n;) obj. showy;∥合法 void showxoi cout <<x < end;)) class derived: private base{∥定义私有派生类 int v: public C void sety(int n)i y=n;) void showy {cout≤<y<<endl;}
(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.公有派生 7 在公有派生中,基类的私有成员对派生类来说仍是基类的私有 成员,只能通过基类的公有成员函数访问相当于可访问性保持 不变),不允许外部函数和派生类的成员函数直接访问。基类中 的公有成员相当于派生类的公有成员,外部函数和派生类的成员 函数可直接访问。 void main 例43 #include <iostream.h> i derived obj; class baset ∥定义基类 obj.setx(10);∥合法 int x; obj.sety(20);∥合法 public: obj. showxO;∥合法 void setx(int n)ix=n; void showx0 cout <<x << endl; obJ. Showyoj ;∥合法 class derived: public base{定义公有派生类 int y; public: void sety(int n)i y=n void showy i cout <<y<< end; j
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{ public: int f0; #include <iostream. h> void maino (Xa class Y: public i public: int fO; int i-a f0; int g0 int j=b f0; cout <<i"<<i<< endl cout <<j=<<j<< endl; 这里bfO用的是Y类的fO还是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
41.3基类的保护成员作用 无论私有派生还是公有派生,派生类无权访问它的基类的私有 成员。派生类要想访问它的基类的私有成员,只能通过调用基类 的成员函数的方式实现,对这有时会带来不便。C十十还提供 种访问属性 protected保护性成员。基类的保护成员具有私有成 员和公有成员双重角色:对自已的对象而言它是私有成员,即不 能被其他程序或函数访问(只能被类中的成员函数访问);而对派 生类而言,它又相当于是基类的公有成员。当公有派生时,基类 的保护成员在派生类也为保护成员。当私有派生时,相当于派生 类的私有成员,派生类的成员函数可以访问它
4.1.3 基类的保护成员作用 无论私有派生还是公有派生,派生类无权访问它的基类的私有 成员。派生类要想访问它的基类的私有成员,只能通过调用基类 的成员函数的方式实现,对这有时会带来不便。C++还提供一 种访问属性protected 保护性成员。基类的保护成员具有私有成 员和公有成员双重角色:对自已的对象而言它是私有成员,即不 能被其他程序或函数访问(只能被类中的成员函数访问);而对派 生类而言,它又相当于是基类的公有成员。当公有派生时,基类 的保护成员在派生类也为保护成员。当私有派生时,相当于派生 类的私有成员,派生类的成员函数可以访问它。 10