2:出现继承和派生之后会出现三种类的用户:普通类使用者,基类设计者(实现类),派生类设计者(实现类)。
基类中的 protect 成员可以为基类设计者直接使用,也可以为派生类设计者直接使用;
基类中的 private 成员可以为基类设计者直接使用,派生类设计者不可以直接使用。
3:基类的实现如果希望派生类设计时可以用,则应声明为 protect ,如果不希望派生类设计可以用,声明为 private。
4:友元不具有传递性,也不具有继承性。
5:一个类 Base 的友元可以访问其所有成员,包括 在 Base 的派生类中 属于 Base的部分数据成员,其友元也可以访问。虽然这看起来很怪,但是仔细考虑 一个类的成员的访问属性只有该类自己控制,在派生类中的继承而来的成员也由该被继承的类控制,而不由派生类控制。
6:虽然在继承的关系中我们希望保护数据的安全性,像 1 中所说那样,但是有时候我们的确需要改变一个成员的访问属性,那么可以人为强制用 using 声明。 在对应的访问说明符下 using base::mem; 这样一句话,就可以改 mem 在派生类中为特定访问属性
注:派生类只可以对其可以访问的名字提供 using 声明。如果自己都访问不了怎么保证其用户可以访问。本质还是保护数据。
7:struct 和 class 声明的类的唯一差别就是默认的成员属性和继承属性,struct 默认为 public,class 默认为 private
8:所有关于访问的属性问题,归根结底是为了保护数据的安全性和程序的安全性。
9:派生类的作用域是嵌套在基类的作用域之内的。而且一直嵌套到最顶层。
10:即使动态类型与静态类型不一致,但是决定我们能否访问一个成员或者变量的决定权在与静态类型。
11:由于作用域的嵌套关系,那么派生类中的同名成员将会隐藏基类中的成员。但是我们可以用作用域运算符来使用隐藏的基类成员。
12:名字查找先与类型检查。一旦查找成功就不在查找了