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

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

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

类的定义

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

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

友元函数和友元类

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

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

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

若一个类为另一个类的友元,则此类的所
有成员都能访问对方类的私有成员。也就是,我认你做朋友了,那么我的东西你随便看随便用,哪怕是私有的东西。认你做朋友的方式,就是在我底下,把你声明成是我的朋友。举个例子如下:

在 A 底下将 B 声明为了友元类,那么 B 中实例化了一个 A 类型的 a,a 中的私有变量就可以被访问了。

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

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

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

公有继承

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

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

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

私有继承

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

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

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

保护继承

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

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

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


总结和记忆方式

总结一下。

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

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

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

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

  1. 公有/私有/保护继承、overload/overwrite/override之间的区别

    一.继承 C++很重要的一个特征就是代码重用.在C语言中重用代码的方式就是拷贝代码.修改代码.C++可以用继承或组合的方式来重用.通过组合或继承现有的的类来创建新类,而不是重新创建它们. 继承是使用已 ...

  2. 从零开始学C++之继承(一):公有/私有/保护继承、overload/overwrite/override之间的区别...

    一.继承 C++很重要的一个特征就是代码重用.在C语言中重用代码的方式就是拷贝代码.修改代码.C++可以用继承或组合的方式来重用.通过组合或继承现有的的类来创建新类,而不是重新创建它们. 继承是使用已 ...

  3. C++中公有继承、保护继承、私有继承

    就class之间的关系做一个简单的定义,继承base class的class,base class可以认为class都是自己的子女. 1.public:public表明该数据成员.成员函数是对所有用户 ...

  4. 公有继承/私有继承/保护继承的区别

    1.公有继承–public 公有继承时,对基类的公有成员和保护成员的访问属性不变,派生类的新增成员可以访问基类的公有成员和保护成员,但是访问不了基类的私有成员.派生类的对象只能访问派生类的公有成员(包 ...

  5. C++公有继承,保护继承,私有继承的区别

    1.公有继承–public 公有继承时,对基类的公有成员和保护成员的访问属性不变,派生类的新增成员可以访问基类的公有成员和保护成员,但是访问不了基类的私有成员.派生类的对象只能访问派生类的公有成员(包 ...

  6. python基础学习-公有变量与私有变量

    1.公有变量 默认上来说对象的属性和方法都是公开的,我们可以通过点这个操作符进行访问 # 公有的属性和方法通过点操作符访问 class Person:name = '人名' p = Person() ...

  7. C++ 公有继承、保护继承和私有继承中类成员的访问权限的控制

    很多同学到现在仍然对访问权限不是很清楚,或者比较模糊,有的同学记了又忘,忘了又记,所以今天想要借这篇文章给大家做一些总结,然后提供一个比较简便的方法去记C++中的访问权限. 众所周知,C++通过pub ...

  8. day4(定义类,公有,私有方法,静态方法,原形方式的属性和方法)

    <script type="text/javascript">//定义类和方法function Person(){this.name="人";//定 ...

  9. python 私有和保护成员变量如何实现?—— 单下划线 开始的成员变量叫做保护变量,意思是只有类实例和子类实例能访问到这些变量; 双下划线 开始的是私有成员,意思是只有类对象自己能访问...

    默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量. 在python中定义私有变量只需要在变 ...

最新文章

  1. R 数据可视化 : 热图
  2. CreateJs入门必知必会
  3. 基于EEG/EMG/EOG的多模态人机接口,实时控制软机器人手
  4. Android: 启动另外的APP及传递参数(转)
  5. 按类别组织的Python主要内置对象类型
  6. os.system方法
  7. gerrit的Change-Id机制和hook机制
  8. Logstash安装与测试
  9. CentOS7安装Docker与使用篇
  10. 谷歌退出中国几成定局 谈判已谈崩
  11. sql server charindex函数和patindex函数详解(转)
  12. 线性表----循环链表和静态链表
  13. 单结晶体管的导电特性_适用于印刷电子的导电墨水可在纸和PET薄膜上印刷薄膜晶体管...
  14. editplus 快捷键及设置tab空白符及删除空格空行
  15. java白盒测试代码_Java白盒测试工具之PMD
  16. vmos模拟的机型_VMOS(虚拟大师)
  17. apple开发者账号区别
  18. POI 自定义16进制颜色导出
  19. LigerUI视频教程_基于LigerUI前端技术实现的管理平台
  20. Excel Application对象应用大全

热门文章

  1. 计算机毕业设计SSM房屋租赁系统【附源码数据库】
  2. 【计算机网络学习笔记09】ARP地址解析协议
  3. win10专业版“引用的账户已锁定,且可能无法登录”解决方案
  4. 人工智能的发展前景怎么样?有哪些方向?
  5. 【亲身体验】华强北的AirPods Pro和Airpods能用吗?? ?
  6. 【小工具】 - 修复软raid阵列状态为inacitve的方法
  7. 【牛客】OJ在线编程常见输入输出练习 C++
  8. php综合复习题大全
  9. 2021年广东省安全员C证第三批(专职安全生产管理人员)实操考试视频及广东省安全员C证第三批(专职安全生产管理人员)作业模拟考试
  10. AE片头模板 闪光特效能量爆炸效果logo展示视频模板