C++ protected访问控制符详解

C++对类成员的访问控制有着严格的要求,它们通过访问控制符public, private以及protected来控制访问权限。其中public和private容易理解,而protected则稍微难以理解,读过C++ Primer一书的同学应该对以下这段话不陌生:

The protected access label can be thought of as a blend of private and public :

  • Like private members, protected members are inaccessible to users of the class.
  • Like public members, the protected members are accessible to classes derived from this class.
  • In addition, protected has another important property:

A derived object may access the protected members of its base class only through a derived object. The derived class has no special access to the protected members of base type objects.

其中,对protected访问控制符给出了三条准则。

1.准则一

如同private成员,protected成员对类的使用者(用户)来说是不可访问的。

有如下示例:

编译:

由上可知,访问protected成员和private成员都会得到错误提示。

2.准则二

如同public成员,protected成员对派生类来说是可以访问的。

有如下示例:

编译、运行:

3.准则三

前两条准则比较容易理解,第三条则过于晦涩,很容易让人摸不着头脑。英文原文如下:
A derived object may access the protected members of its base class only through a derived object. The derived class has no special access to the protected members of base type objects.

先看前一句:派生类对象或许可以(比如派生类的成员或友员函数就可以)访问基类的protected成员,但也只能通过派生类对象去访问。

这句话换个说法就是:派生类的成员或友员函数只能通过派生类对象去访问基类的protected成员。注:重点是通过派生类对象访问,可以理解为访问的是派生类的成员(由基类继承而来)。重要的事情说三遍,派生类,派生类,派生类。

再看后一句:派生类是无法访问基类中的protected成员的。注:重点是基类中的protected成员,重要的事情说三遍,基类,基类,基类。

看下面示例:

编译、运行:

再看一个例子:

编译、运行:

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注