friend 关键字声明的函数或类。friend。 |
|
24 |
duplicate 是类 Rectangle 的一个友元。因此,函数 duplicate 能够访问 Rectangle 类型不同对象的成员 width 和 height(它们是私有的)。但请注意,无论是在 duplicate 的声明中,还是之后在 main 函数中的使用,函数 duplicate 都未被视作类 Rectangle 的成员。它不是!它只是有权访问其私有和保护成员,但本身并非成员。 |
|
16 |
Rectangle 是类 Square 的友元,这允许 Rectangle 的成员函数访问 Square 的私有和保护成员。更具体地说,Rectangle 访问了描述正方形边长的成员变量 Square::side。Square 的空声明。这是必需的,因为类 Rectangle 用到了 Square(作为成员函数 convert 的参数),而 Square 又用到了 Rectangle(声明其为友元)。Square 将 Rectangle 视为友元类,但 Rectangle 并不将 `Square` 视为友元。因此,Rectangle 的成员函数可以访问 Square 的保护和私有成员,但反之则不行。当然,如果需要,Square 也可以被声明为 Rectangle 的友元,从而授予这种访问权限。Polygon 类,然后从它派生出另外两个类:Rectangle 和 Triangle。
Polygon 类将包含两种多边形共有的成员。在我们的例子中是:width 和 height。而 Rectangle 和 Triangle 将是它的派生类,各自拥有不同于其他多边形的特定特性。A,我们从它派生出一个带有另一个成员 B 的类,那么这个派生类将同时包含成员 A 和成员 B。class derived_class_name: public base_class_name
{ /*...*/ };
derived_class_name 是派生类的名称,base_class_name 是其所基于的类的名称。public 访问说明符可以被其他任何访问说明符(protected 或 private)替换。这个访问说明符限制了从基类继承的成员的最宽松访问级别:访问级别更宽松的成员将以此级别被继承,而访问级别相同或更严格的成员则在派生类中保持其严格级别。 |
|
20 10 |
Rectangle 和 Triangle 的对象各自包含从 Polygon 继承的成员。它们是:width、height 和 set_values。Polygon 类中使用的 protected 访问说明符与 private 类似。它们唯一的区别实际上体现在继承上:当一个类继承另一个类时,派生类的成员可以访问从基类继承的保护成员,但不能访问其私有成员。width 和 height 声明为 protected 而不是 private,这些成员也可以从派生类 Rectangle 和 Triangle 中访问,而不仅仅是从 Polygon 的成员中访问。如果它们是 public,那么它们可以从任何地方被访问。| 访问权限 | public | protected | private |
|---|---|---|---|
| 同一个类的成员 | 是 | 是 | 是 |
| 派生类的成员 | 是 | 是 | 否 |
| 非成员 | 是 | 否 | 否 |
main 函数、从另一个类或从一个函数中访问。Rectangle 和 Triangle 继承的成员具有与它们在基类 Polygon 中相同的访问权限。 |
|
public 关键字来声明。 |
|
:)后面的 public 关键字指定了从其后类(本例中为 Polygon)继承的成员在派生类(本例中为 Rectangle)中所能拥有的最宽松的访问级别。由于 public 是最宽松的访问级别,通过指定此关键字,派生类将以与基类中完全相同的访问级别继承所有成员。protected 继承,基类的所有 public 成员在派生类中都会变成 protected。反之,如果指定了最严格的访问级别(private),那么所有基类成员都会被继承为 private。 |
|
protected 设置为 Daughter 从 mother 继承的成员的最宽松访问级别。也就是说,所有在 Mother 中是 public 的成员,在 Daughter 中都会变成 protected。当然,这并不会限制 Daughter 声明自己的 public 成员。这个“最宽松访问级别”只针对从 Mother 继承来的成员。class 关键字声明的类默认使用 private 继承,对用 struct 声明的类默认使用 public 继承。derived_constructor_name (parameters) : base_constructor_name (parameters) {...}
|
|
Mother: no parameters Daughter: int parameter Mother: int parameter Son: int parameter |
Daughter 对象和 Son 对象时,调用的 Mother 构造函数是不同的。这种差异是由于 Daughter 和 Son 的构造函数声明不同所致。 |
|
Output,并且我们希望我们的 Rectangle 和 Triangle 类在继承 Polygon 成员的同时,也继承 Output 的成员,我们可以这样写: |
|
|
|
20 10 |
特殊成员 | 目录 | 多态 |