三十八、继承与派生:派生类对基类成员的访问控制之保护继承与私有继承

1、保护继承
	保护继承中,基类的公有和保护成员被派生类继承后变成派生类的保护成员,基类的私有成员在派生类中不能访问。但派生类的新增成员可以直接访问基类的公有和保护成员,但派生类对象则不能访问他们。因为、类的对象也处于类外,不能访问类的保护成员。对于基类私有成员,派生类新增成员和派生类对象都不能访问。
         这里我们可以看出保护成员访问属性的作用了。如类A,B为其派生类,对于B,A类中的公有和保护成员访问权限一样。但对于A类对象来说,A的中保护成员和私有成员一样不能访问。可以类中的保护成员可以被派生类访问,但不能被类外对象访问。(如该类对象、一般函数、其他类)。这样我们可以充分做到数据的隐藏和共享的结合。
class Base
      {
      protected:
                  int x;           // 基类的保护成员
      };
      int main()
      {
                 Base base;
                 base.x = 0;      // 编译报错
                            //不能通过Base类对象访问保护成员,和私有成员一样实现了数据隐藏
                 return 0;
      }
 
  classBase
       {
        protected:
                    int x;           // 基类的保护成员
       };
      class Child : public Base
       {
      public:
                    void InitX();
       };
       void Child::InitX()
       {
                    x = 0;  //派生类成员函数直接访问基类保护成员
//在派生类Child中,基类保护成员和公有成员访问权限一样
       }

2、私有继承
	基类的公有和保护成员被派生类继承后变成派生类的私有成员,基类的私有成员在派生类中不能访问。派生类新增成员可以直接访问基类的公有和保护成员,但派生类对象不能访问。同时,派生类成员和对象都不能访问基类的私有成员。
	这里我们可能认为,私有和保护继承的效果一样,都是派生类可以访问基类公有和保护成员,不能访问基类私有成员。但当我们考虑连续继承时,效果就大不一样了。如A->B->C.
	如果是私有继承,则最后类C不能访问A中的任何成员,无论是公有,保护还是私有。如果是公有或保护继承时,就不存在此情况。
结论:私有继承使得基类成员在其后续的派生类中不能再访问,中止了基类成员继续向下派生。这明显对代码复用性没好处,所以一般也很少使用。
#include<iostream>
using namespace std;
class Base
{
         public:
                   voidSetTwo(int x,int y){a=x;b=y;}
                   intGetA(){return a;}
                   intGetB(){return b;}
         private:
                   inta,b;
};
class Derived : private Base  //私有继承
{
         public:
                   voidSetThree(int x,int y,int z){SetTwo(x,y);c=z;}
                            //类内部可以访问基类公有或保护成员SetTwo(),基类的公有成员都变为派生类的私有成员
                   intGetA(){return Base::GetA();} //同名覆盖,不能访问基类的私有成员,直接调用基类的函数返回
                   intGetB(){return Base::GetB();}
                   intGetC(){return c;}
         private:
                   intc;  //新增私有成员
};
int main()
{
         Derivedd;
         d.SetThree(1,2,3);
         cout<<d.GetA()<<""<<d.GetB()<<" "<<d.GetC()<<endl;
         return0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值