例4.4 保护继承的访问规则举例

来源:互联网 发布:贝克曼梁法弯沉数据 编辑:程序博客网 时间:2024/05/19 19:43
/*3.保护继承的访问规则当类的继承方式为保护继承时,基类的公有成员和保护成员被继承到派生类中都作为派生类的保护成员,派生类的其他成员可以直接访问它们,但是在类的外部,不能通过派生类的对象来访问它们。基类的私有成员不允许派生类继承,因此在私有派生类中是不可直接访问的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问基类的私有成员。表4.4总结了保护继承的访问规则。表4.4 保护继承的访问规则----------------------------------------------------------  基类中的成员    |  私有成员  |  公有成员  |  保护成员  |----------------------------------------------------------|内部访问 |  不可访问  |  可访问    |  可访问    |访问方式|  |   |        |            ||对象访问 |  不可访问  | 不可访问   |  不可访问  |----------------------------------------------------------*/// 例4.4 保护继承的访问规则举例。#include<iostream>using namespace std;class Base{             //声明基类Base  public:    int z;    void setx(int i){      x = i;    }    int getx(){      return x;    }  private:    int x;  protected:    int y;};class Derived:protected Base{   //声明基类Base的保护派生类Derived  public:  int p;  void setall(int a,int b,int c,int d,int e,int f);  void show();  private:  int m;  protected:    int n;};void Derived::setall(int a,int b,int c,int d,int e,int f){x=a;           //错误,在派生类Derived中,x为不可直接访问成员               //可修改为 setx(a);y=b;           //正确,y在派生类Derived中为保护成员,派生类对象能访问它z=c;           //正确,z在派生类Derived中为保护成员,派生类对象能访问它m=d;n=e;p=f;}void Derived::show(){cout<<"x="<<x<<endl;        //错误,在派生类Derived中,x为不可直接访问成员cout<<"x="<<getx()<<endl;   //正确,函数getx在派生类Derived中为保护成员                            //派生类成员函数能访问它cout<<"y="<<y<<endl;        //正确,y在派生类Derived中为保护成员                            //派生类成员函数能访问它cout<<"z="<<z<<endl;        //正确,z在派生类Derived中为保护成员                            //派生类成员函数能访问它 cout<<"m="<<m<<endl;        //正确,m为派生类Derived的私有成员                            //派生类成员函数能访问它cout<<"n="<<n<<endl;        //正确,n为派生类derived的保护成员,派生类成员函数能访问它}int main(){Derived obj;obj.setall(1,2,3,4,5,6);obj.show();cout<<"y="<<obj.y<<endl;  //错误,y为派生类Derived的保护成员,派生类对象不能访问它cout<<"p="<<obj.p<<endl;  //正确,p为派生类derived的公有成员,派生类对象可以访问它return 0;}/*例中派生类Derived有基类Base保护派生出来,所以基类Base中的私有数据成员x在保护派生类Derived中是不可直接访问成员,因此派生类成员函数setall和show不能访问它。基类Base中的保护数据成员y在保护派生类Derived中仍是保护成员,因此派生类成员函数setall和show能够访问它,但是派生类Derived的对象obj不能访问它。派生类Derived的数据成员p是公有成员,所以派生类Derived的对象obj可以访问它。如果将例中派生类Derived的成员函数Derived::setall改成如下形式:void Derived:setall(int a,int b,int c,int d,int e,int f){setx(a);y=b;z=c;m=d;n=e;p=f;}并且去掉主函数main和Derived::show中的错误语句,重新编译后程序将顺利通过。修改后,本程序运行结果如下:x=1y=2z=3m=4n=5p=6*/

阅读全文
0 0