访问控制与继承

受保护的成员

protect 关键字来声明那些希望与派生类分享但是不想被其他公共访问使用的成员:

  • 和私有成员类似,受保护的成员对于类的用户来说是不可访问的。
  • 和公有成员类似,受保护的成员对于派生类的成员和友元是可访问的。
  • 派生类的成员或友元只能通过派生类对象来访问基类的受保护成员。派生类对于一个基类对象中的受保护成员没有任何访问特权。

公有、私有和受保护继承

某个类对其继承而来的成员的访问控制受到两个因素影响:

  • 基类中该成员的访问说明符。
  • 派生类的派生列表中的访问说明符。

派生访问说明符对于派生类的成员(及友元)能否访问其直接基类的成员没什么影响。对基类成员的访问权限只与基类中的访问说明符有关。

派生访问说明符的目的是控制派生类用户(包括派生类的派生类在内)对于基类成员的访问权限:

  • 如果继承是公有的,则成员将遵循原有的访问说明符。
  • 如果继承是私有的,则基类的成员是私有的。

派生类向基类转换的可访问性

假定 D 继承自 B :

  • 只有当 D 公有地继承 B 时,用户代码才能使用派生类向基类的转换。如果 D 继承 B 的方式是受保护的或者私有的,则用户代码不能使用该转换。
  • 不论 D 以什么方式继承 B,D 的成员函数和友元都能使用派生类向基类转换。派生类向其直接基类的类型转换对于派生类的成员和友元来说永远是可访问的。
  • 如果 D 继承 B 的方式是公有的或者受保护的,则 D 的派生类的成员和友元可以使用 D 向 B 的类型转换。反之,如果 D 继承 B 的方式是私有的,则不能使用。

对于代码中的某个给定节点来说,如果基类的公有成员是可访问的,则派生类向基类的类型转换也是可访问的,反之则不行。

友元与继承

友元关系不能传递和继承。

基类的友元在访问派生类成员时不具有特殊性,派生类的友元也不能随意访问基类的成员。

每个类负责控制自己成员的访问权限,这种可访问性包括了基类对象内嵌在其派生类对象中的情况。

当一个类将另一个类声明为友元时,这种友元关系只对做出声明的类有效。对于原来那个类来说,其友元的基类或派生类不具有特殊的访问能力。

改变个别成员的可访问性

通过在类的内部使用 using 声明语句可以将该类的直接或间接基类中的任何可访问成员标记出来。

using 声明语句中名字的访问权限由该 using 声明语句之前的访问说明符决定:

  • 如果一条 using 声明语句出现在类的 private 部分,则该名字只能被类的成员和友元访问。
  • 如果 using 声明语句位于 public 部分,则类的所有用户都能访问它。
  • 如果 using 声明语句位于 protected 部分,则该名字对于成员、友元和派生类是可访问的。

默认的继承保护级别

默认派生运算符也由定义派生类所用的关键字来决定:

  • 使用 class 关键字定义的派生类是私有继承。
  • 使用 struct 关键字定义的派生类是公有继承。

struct 关键字和 class 关键字定义的类之间唯一的差别就是默认访问说明符及默认派生访问说明符。

posted @ 2020-07-12 11:16  CodeWithMe  阅读(160)  评论(0)    收藏  举报