C++ 基础之公有、私有和保护(一句话说清楚)

C++ 基础之公有、私有和保护

公有继承、私有继承和保护继承,什么七七八八的,一句话说清楚。

数据成员和成员函数的公有、私有和保护

类的定义

我们知道,定义一个类,类里面的成员包括数据成员(属性)和成员函数(方法)。数据成员是描述类的属性的一些数据,成员函数是描述类的行为的一些数据。
类的成员根据它们的访问权限,在类内被分成了三类:公有(public)、私有(private)和保护(protected)。
对于成员的访问,一般来说有类内访问和类外访问。类内访问就是类里面的其它成员直接使用成员名进行访问。类外访问,意思是通过形如对象名.成员名的方式进行访问。此时的.可以理解为中文的“的”。当然,->也有相同的含义。

  • 公有成员:类内和类外都可访问。
  • 私有成员:类内可访问,类外不可访问。友元可访问。什么是友元,下面会介绍。
  • 保护成员:不涉及继承,和私有成员没什么区别,涉及继承,有什么区别,后面会介绍。

友元函数和友元类

对象中的保护( protected )成员和私有( private )成员不允许被非成员函数直接访问,这称为类的封装性。为了外部访问类内的私有和保护数据,我们可以定义友元。这么做事为了实现数据共享,提高执行效率,同时,又保有类的一定的封装性和数据隐藏性。

友元可以是一个函数,该函数称为友元函数。友元也可以是一个类,该类被称为友元类。

类的友元函数是指在类定义的一个普通函数,不是类的成员函数,但是它可以自由地访问类中的私有数据成员。它访问对象中的成员必须通过对象名。使用的格式如下(使用友元函数计算两点间的距离):
在这里插入图片描述

若一个类为另一个类的友元,则此类的所
有成员都能访问对方类的私有成员。也就是,我认你做朋友了,那么我的东西你随便看随便用,哪怕是私有的东西。认你做朋友的方式,就是在我底下,把你声明成是我的朋友。举个例子如下:
在这里插入图片描述
在 A 底下将 B 声明为了友元类,那么 B 中实例化了一个 A 类型的 a,a 中的私有变量就可以被访问了。

主要注意的几点:友元关系不可以被继承;友元关系是单向的;友元关系不能传递。

公有继承、私有继承和保护继承

派生类的三种继承方式,包括公有继承、私有继承和保护继承。不同继承方式的区别主要在于:派生类的成员对继承下来的基类成员访问权限和派生类通过对象的方式(即.或者->的方式)对继承下来的基类成员的访问权限。使用的方式如下:
在这里插入图片描述

公有继承

  • 派生类中的成员函数:可以直接访问基类的公有和保护成员,但不能访问基类的私有成员。
  • 通过派生类的对象(即用“的”的方式):只能访问基类的公有成员。
    看起来弯弯绕绕地,比较难记,其实只要把握住以下几点就可以了。首先,是终极的原则。终极原则是三种继承方式必须要遵守的最重要的一条基本原则。

终极原则:私有成员永远只能被本类的成员函数访问,或者是友元访问,除此以外,即使是其派生出的子类,也不能直接访问这些私有成员。

在这个终极原则的基础之上,公有继承就是保持基类成员的属性不变。也就是说,对于新增成员就不说了,对于基类继承下来的成员,公有还是公有,保护还是保护,私有在终极原则的基础上,对新增成员不可见了,对基类的成员还是可以访问的。这里也就体现出来了保护成员的作用,或者说它和私有变量的一个区别,它也可被派生类的新增成员函数调用。

私有继承

私有继承也是默认的继承方式,如果没有继承方式的关键字说明,默认为私有继承。什么叫私有继承呢?很简单,就是在终极原则的基础之上,基类的所有成员都以 private 身份出现在派生类中。

都变成私有了,也就是说,继承到此为止了,该派生类曾经继承的基类,在该派生类下级的派生
类中完全被屏蔽了。因为是私有的,再往下继承,都变得对于下一代的派生类不可见的。当然,想在下一代的派生类访问基类的成员时,需要在该派生类中再重新定义一个公有函数。

在终极原则的指导下,对于不需要再往下继承的类功能可以用私有继承方式把它们隐蔽起来,这样,下一层的派生类无法访问其任何成员。这叫断子绝孙。

保护继承

保护继承和私有继承类似,它是基类的 public 和 protected 成员(终极原则 pass 掉了 private 成员),都以 protected 身份出现在派生类中。

如果不再往下继承的话,保护继承和私有继承是一样的。

保护成员,所谓的保护保护,就是要保护它能够被派生类的新增的成员访问,这也是它区别于私有成员的地方。

在这里插入图片描述
在这里插入图片描述

总结和记忆方式

总结一下。

终极原则:私有成员永远只能被本类的成员函数访问,或者是友元访问,除此以外,即使是其派生出的子类,也不能直接访问这些私有成员。

在终极原则的基础上:公有继承就是属性不变,私有继承都变私有,保护继承都变保护。 So easy!

有人问,为什么 C++ 要把自己搞得这么麻烦。这就涉及到 C++ 的封装、继承和多态的特性了。为什么非要搞出这些特性?等你接触的项目多了,看的代码多了,就知道其优势了。

©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页