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; }
三十八、继承与派生:派生类对基类成员的访问控制之保护继承与私有继承
最新推荐文章于 2021-08-29 10:09:16 发布