►无论采用何种继承方式得到的派生类,派生类成员及其友元都不能访问基类的私有成员,派生类外部的用户只能访问公有属性的成员。
►多级派生的情况下,保护继承和私有继承会进一步地将基类的访问权限隐蔽成不可访问的。
►一般地,保护继承与私有继承在实际编程中是极少使用的,它们只在技术理论上有意义。
【例34.1】访问权限举例
1 class A {2int k;3 public:4int i;5 protected:6voidf2();7int j;8};9 class B:public A {//public继承 10int m;11 public:12voidf3();13 protected:14voidf4();15};16 class C: protected B {//protected继承 17int n;18 public:19voidf5();20};21intmain()22{23return0;24}
2、赋值兼容规则
3、赋值兼容规则
►赋值兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。
►通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有成员。这样,公有派生类实际就具备
了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。
►赋值兼容规则中所指的替代包括以下的情况:
►①派生类的对象可以赋值给基类对象;
►②派生类的对象可以初始化基类的引用;
►③派生类对象的地址可以赋给指向基类的指针。
►例:
class Base {};//基类
class Derive : public Base {};//公有派生类
Base b,*pb;//定义基类对象、指针
Derive d;//定义派生类对象
►这时,支持下面三种操作:
b=d;//派生类对象赋值给基类,复制基类继承部分
Base &rb=d;//基类引用到派生类对象
pb=&d;//基类指针指向派生类对象
►赋值兼容规则是C++多态性的重要基础之一。
4、赋值兼容规则举例
【例34.2】赋值兼容规则举例
1 #include <iostream>2 using namespace std;3 class man //基类man 4{5 protected:6int age;7 string name;8 public:9man(int a,string n):age(a),name(n){}//基类的构造函数 10voidprint()11{cout<<"姓名:"<<name<<",年龄:"<<age<< endl;}12intget_age(){return age;}13 string get_name(){return name;}14};15 class superman:public man //派生类superman 16{17 private:18int force_value;//派生类增加的数据成员 19 public:20superman(int a,string n,int f)21:man(a,n),force_value(f){};//派生类的构造函数 22voidprint()23{24 cout<<"姓名:"<<name<<",年龄:"<<age<<"武力值: "<<force_value<<endl;25}26voidfly(){cout<<"fly,fly,fly……"<<endl;}//派生类增加的成员函数 27};28intwork(man a)//形参为基类对象 29{30if(a.get_age()>=20)return1;31elsereturn0;32}33intmain()34{35int n;36 man i(25,"jerry");37 superman j(20,"clark",100);38 n=work(j);//实参为派生类对象 39if(n!=0) cout<<j.get_name()<<"可以胜任此项工作。"<<endl;40else cout<<j.get_name()<<"不可以胜任此项工作。"<<endl;41return0;42}
【例34.2】赋值兼容规则举例226intwork(man *a)//形参为基类指针 27{28if(a->get_age()>=20)return1;29elsereturn0;30}31intmain()32{33int n;34 man i(25,"jerry");35 superman j(20,"clark",100);36 n=work(&j);//实参为派生类对象的地址 37if(n!=0) cout<<j.get_name()<<"可以胜任此项工作。"<<endl;38else cout<<j.get_name()<<"不可以胜任此项工作。"<<endl;39return0;40}
【例34.2】赋值兼容规则举例326intwork(man &a)//形参为基类引用 27{28if(a.get_age()>=20)return1;29elsereturn0;30}31intmain()32{33int n;34 man i(25,"jerry");35 superman j(20,"clark",100);36 n=work(j);//实参为派生类对象 37if(n!=0) cout<<j.get_name()<<"可以胜任此项工作。"<<endl;38else cout<<j.get_name()<<"不可以胜任此项工作。"<<endl;39return0;40}