10.2.2 protected成员与protected派生
在第8章和第9章给出的示例中,数据成员多设定为private成员,也就是私有成员,私有成员只能被本类的成员函数所访问,不能通过“对象名.成员”的形式来访问。如果想做到基类的某些成员只能在派生类中访问,而不被外部的函数或对象访问,用private派生和public派生是无法实现的。首先,基类中的私有成员无论采用public派生还是private派生,在外部或其他类(包括派生类)中都是不可见的。其次,类中的public成员在public派生时,不仅可以在派生类中访问,也可以在外部或其他类中访问。再次,类中的public成员在private派生时,虽然只能在派生类内访问,在外部或其他类中无法访问,但用派生类再派生下一级的类时,基类中的所有成员都无法在“派生类的派生类”中访问。
为解决这一问题,C++引入了protected成员,protected类型的成员是一种区分血缘关系内外有别的成员,在派生类中可以访问protected成员,但在外部或其他类中,protected成员和private成员一样,无法被访问。
C++还允许使用protected派生方式,丰富后的访问权限如表10.2所示。
从表10.2可以归纳出如下几条规则。
❑基类的private成员在外部和其他类(包括派生类)中都是不可见的。
❑private派生使得基类中的非private成员都成为派生类中的private成员,在外部和其他类中无法访问。
❑protected派生使得基类中的非private成员都降一级:基类中的protected成员成为派生类中private成员,基类中public成员成为派生类中的protected成员。
❑public派生时,基类中的非private成员在派生类中的访问属性保持不变。