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 |
![]() 特殊成员 | ![]() 目录 | ![]() 多态 |