Visual C++类的继承及类中成员的访问特性——搞懂public、protected、private

我是荔园微风,作为一名在IT界整整25年的老兵,今天来说说Visual C++中类的继承及类中成员的访问特性,也就是来搞懂public、protected、private这三个东西。

很多人搞不清楚这三个东西,并且很容易弄错,其实不是学习的人的错,而是网上很多帖子要不就是太复杂把初学者搞晕,要不就是只说了public、protected、private这三个东西的第一层意思,没有说第二层意思导致初学者搞错了意思。

现在我们就来好好说说public、protected、private这三个东西。

我们先来看public、protected、private的第一层意思。

(一)public、protected、private三种访问权限的比较

1. public定义的成员可以在任何地方被访问。

2. protected定义的成员只能在该类及其子类中访问。

3. private定义的成员只能在该类自身中访问。

上面这个第一层意思,是指被public、protected、private这三个东西修饰的成员到底具有什么被别的类访问的权限。我打一个什么比方比较好呢。来看看。

被public定义的成员就好比某一户人家的客厅,可以欢迎客人到你家来访问。可以在这里请客人吃饭、看电视、交谈等等。也就是说,类以外的程序想访问类里面的成员,他只能访问public定义的成员,所以public都是公开的。

被protected定义的成员就好比某一户人家的书房。这个区域客人一般不让他们进,往往是只给小孩使用的,也就是给子类访问的,当然家长也可以用,所以本类成员也可以访问protected定义的成员。

被private定义的成员就好比某一户人家的卧室,这个区域绝对不给访客访问,一般也不让小孩访问,小孩有自己的房间,这个房间只给家长访问。哈哈哈,我这个比喻不错吧。

好,我们再先来看public、protected、private的第二层意思。这一层意思和上面的第一层意思在用法上完全不同,这就是大家最容易搞错的地方。或者我可以这么说,下面的 public、protected、 private和上面的 public、protected、private是不一样的,我们可以当做全新的 public、protected或 private来看待,我们把下面的public、protected或 private当成全新的来看,就不会和上面的public、protected或 private搞混。

(二)public、protected、private在继承关系方面的比较

对于继承,也可以有 public、protected或 private 这三种访问权限去继承基类中的成员。

例如,如下所示代码中,

class Fish : public Animal

Fish类继承Animal类,就是采用 public的继承方式。

1. 如果在定义派生类时没有指定如何继承访问权限,则默认为private。

2. 如果派生类以private访问权限继承基类,则基类中的成员在派生类中都变成了private类型的访问权限。

3. 如果派生类以public访问权限继承基类,则基类中的成员在派生类中仍以原来的访问权限在派生类中出现。

4. 如果派生类以protected访问权限承基类,则基类中的public和protected成员在派生类中都变成了protected类型的访问权限。

5. 基类中的private成员不能被派生类访问,因此,private成员不能被派生类所继承。

上面的内容主要是给急性子看,下面我们来慢慢总结一下。

数据隐藏是C++面向对象编程的重要特征之一,它允许我们隐藏对象内部细节即数据成员,防止程序的函数直接访问一个类对象的内部表示、数据成员和成员函数。对类成员函数的访问限制由访问修饰符指定。访问修饰符在 C++ 中也称为可见性模式,private、public 和 protected 都是可见性模式的类型。

对比与总结

C++ 中 Private、Public 和 Protected 的区别

Private

Public

Protected

声明为private类成员只能由基类内部的函数访问。

可以从任何地方访问声明为public的类成员。

声明为protected类成员可以在基类及其派生类中访问。

private成员使用关键字private后跟冒号 (:) 字符来声明。

public成员使用关键字public后跟冒号 (:) 字符来声明。

protected成员使用关键字protected后跟冒号 (:) 字符来声明。

private成员能被子类继承,但不能被子类的对象直接访问。

public成员可以在子类中被继承并被直接访问。

protected成员可以在子类中被继承并访问。

它为其数据成员提供高安全性。

它不为其数据提供任何类型的安全性。

它提供的安全性低于private访问说明符。

可以在友元功能的帮助下访问private成员。

public成员可以在有或没有友元功能的帮助下访问。

protected成员不能通过友元函数访问,它们在类之外是不可访问的,但它们可以被该类的任何子类(派生类),包括派生类及派生类的子类访问。

访问说明符已用于确定该类之外的类成员(数据成员和成员函数)的可用性。

在继承中,知道派生类的对象何时可以使用基类中的成员函数很重要,这称为可访问性,访问说明符用于确定这一点。

private、public 和protected 都是C++ 中访问说明符的类型。如果未提及或指定可见性模式,则默认情况下会考虑private模式。

当类的成员被声明为 public 时,就可以从任何地方访问它们。

当类中的成员被声明为protected时,它们就可以在基类和派生类中访问。

当类中的成员被声明为private时,它们只能被基类的成员和友元函数访问。

与public和protected访问说明符相比,private访问说明符为其数据成员提供更多的安全性。

将你的类属性声明为private(尽可能经常)被认为是一种很好的做法,因为这将有助于提高数据安全性。

访问修饰符主要用于数据隐藏和封装,因为它们可以帮助我们控制程序的哪一部分可以访问类的成员。这样就可以防止滥用数据。

总结

对于三种继承,对基类里的private对象处理方式都是一致的,即对派生类都是不可访问的,但它确实被继承了,可以通过基类里的函数来访问。三种继承的不同之处在于:公有继承是将基类的public和protected成员直接继承不改变其属性(即继承后依然是public和potected的),保护继承将基类的public和protected成员直接继承为派生类的protected成员。而私有继承则直接将基类的protected和public成员继承为派生类的private成员。

不难发现,存在着这样的一个优先级:private > protected > public,举个例子:

(1)当继承方式为public时,派生类里所继承的成员就是基类里对应成员的属性(public优先级最低覆盖不了其它关键字)

(2)当继承方式为protected时,派生类里所继承的成员属性只有public会改变为protected(优先级protected > public,protected能覆盖public)

(3)当继承方式为private时,派生类里所继承的成员属性全为private(private优先级最高,相当于覆盖了其它两个优先级)。

作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/32457.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ModaHub魔搭社区:向量数据库MIlvus服务端配置(三)

目录 gpu 区域 logs 区域 metric_config 区域 gpu 区域 在该区域选择是否在 Milvus 里启用 GPU 用于搜索和索引创建。同时使用 CPU 和 GPU 可以达到资源的最优利用,在特别大的数据集里做搜索时性能更佳。 若要切换到 CPU-only 模式,只要将 enable 设…

【VMD-LSTM】变分模态分解-长短时记忆神经网络研究(Python代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

数据库大题

(计算题,20分) 设有两个关系R和S,求① R ∪ S R \cup S R∪S;② R − S R - S R−S;③ R S R \times S RS;④ ∏ C , A ( R ) \prod_{C,A}(R) ∏C,A​(R);⑤ σ B > ′ 4 ′ ( R ) \sigma_{B>4}(R) σB>′4′​(R) 关系R关系S (简答题,10…

基于深度学习FasterRCNN模型Restnet50 的生活垃圾智能分类(准确率达84%)-含python工程全源码

目录 前言总体设计系统整体结构图系统流程图 运行环境1. 硬件环境2. Python 环境 模块实现1. 数据预处理2. 数据加载3. 模型构建4. 模型训练及保存5. 模型加载与调用 系统测试1. 模型准确率2. 分类别准确率 工程源代码下载其它资料下载 前言 本项目基于Faster R-CNN模型&#…

jenkins流水线Pipeline的使用

pipeline流水线 1、jenkins安装pipeline插件 2、创建流水线项目 1、创建pipeline的流水线项目 2、编写流水线 pipeline {agent anystages {stage(拉去代码) {steps {git credentialsId: gitee, url: https://gitee.com/xwb1056481167/jenkins-demo.gitecho 拉去代码}}stage(m…

Vue中如何进行数据导入与Excel导入

Vue中如何进行数据导入与Excel导入 Vue是一款非常流行的JavaScript框架,它提供了一套用于构建用户界面的工具和库。在Vue中,我们可以使用多种方式来导入数据,包括从服务器获取数据、从本地存储获取数据、从文件中读取数据等等。其中&#xf…

NVIDIA Jetson TX1,TX2,TX2 NX,AGX Xavier 和 Nano开发板GPIO口配置及应用

NVIDIA Jetson TX1,TX2,TX2 NX,AGX Xavier 和 Nano开发板GPIO口配置及应用 简介 ​ Jetson TX1、TX2、TX2 NX、AGX Xavier和Nano开发板都配备了一个包含40个引脚的GPIO接头,这些引脚可以用于数字输入输出。如下图 ​ 类似于Rasp…

Solid Converter PDF v10 安装及使用教程

目录 一、软件介绍二、下载教程三、安装教程四、使用教程1.PDF转Word、Html等2.合并PDF文件 一、软件介绍 Solid Converter PDF是一套专门将PDF文件转换成Word的软件。 能够将PDF转换为Word、Excel、HTML、PowerPoint、纯文本文件从PDF文档中提取数据并以CSV等格式保存能够转…

【人工智能】— 深度神经网络、卷积神经网络(CNN)、多卷积核、全连接、池化

【人工智能】— 深度神经网络、卷积神经网络(CNN)、多卷积核、全连接、池化 深度神经网络训练训练深度神经网络参数共享 卷积神经网络(CNN)卷积多卷积核卷积全连接最大池化卷积池化拉平向量激活函数优化小结 深度神经网络训练 Pr…

Pytest+selenium+allure+Jenkins自动化测试框架搭建及使用

一、 环境搭建 1. Python下载及安装 Python可应用于多平台包括windows, Linux 和 Mac OS X, 本文主要介绍windows环境下。你可以通过终端窗口输入 "python" 命令来查看本地是否已经安装Python以及Python的安装版本。 如未安装python, 推荐下载python 3.8.3以…

Prompt的技巧持续总结

Prompt 有很多网站已经收录了,比如:aimappro 有些直接抄上述网站的作业即可,不过也来看看, 有一些日常提问大概的咒语该怎么写。 1 三种微调下的提示写法 chatgpt时代的创新:LLM的应用模式比较 实际案例说明AI时代大…

将win上的文件传输到Ubuntu虚拟机

首先获取Ubuntu系统的ip地址,在Ubuntu的Terminal中输入ifconfig,可以看到Ubuntu的ip地址 可以看到我电脑的ip地址是10.0.2.15。更改虚拟机的网络连接 这里以VirtualBox为例,打开VirtualBox设置,选择网络,将连接方式改…

通付盾入围《2023年度中国数字安全能力图谱(行业版)》

近日,数世咨询发布《2023年度中国数字安全能力图谱(行业版)》。通付盾作为以分布式数字身份和大数据决策智能技术为核心的数字化高端软件与服务提供商,凭借在数字安全领域的实力和影响力,入选政府、互联网两大行业细分…

ElasticSearch的安装和访问

ElasticSearch的安装 前言: 本次下载是在Windows系统进行操作,版本为7.6.1,因为下周最新版本的8.1.2有问题 ElasticSearch基于Java开发,JDK最低1.8版本 ElasticSearch的版本要和之后引入的Maven的Jar包版本对应 1 下载ElasticSearch 官网:https://www.elastic.co/cn/ 产品…

【yocto1】利用yocto工具构建嵌入式Linux系统

文章目录 1.获取Yocto软件源码2.初始化Yocto构建目录2.1 imx-setup-release.sh脚本运行2.2 imx-setup-release.sh脚本解析2.2.1 setup-environment脚本解析 3.构建嵌入式Linux系统3.1 BitBake构建系统3.2 BitBake构建系统过程简要解析3.2.1 解析Metadata基本配置Metadatarecipe…

Spring Boot面试题

什么是 Spring Boot? Spring Boot 是一个简化 Spring 应用程序开发的框架,通过自动配置、起步依赖和简化的配置方式,使开发人员能够更快速、方便地创建和配置 Spring 应用程序,提高开发效率和开发体验。 Spring Boot 的设计目标…

如何做一份干净的git提交记录

背景 毕业工作有一些年头了,之前在写工作代码或者给开源项目贡献的时候,提交代码都不是很规范,甚至可以说十分的随意,想到什么就提交什么,根本没有管理提交记录的概念或者想法(当你身边的人都不怎么在意的…

基于 Wav2Lip-GFPGAN 深度学习模型的数字人Demo

写在前面 工作中遇到简单整理博文为 Wav2Lip-GFPGAN 环境搭建运行的 Demo理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是…

kubernetes operator解析

您是否想过站点可靠性工程 (SRE) 团队如何有效地成功管理复杂的应用程序? 在 Kubernetes 生态中,只有一个答案:Kubernetes Operators! 在本文中,我们将研究它们是什么以及它们是如何工作的。 Kubernetes Operator 概念…

RabbitMQ 能保证消息可靠性吗

系列文章目录 消息队列选型——为什么选择RabbitMQ RabbitMQ 五种消息模型 RabbitMQ 能保证消息可靠性吗 系列文章目录前言一、消息可靠性的定义二、几种不可靠的场景三、防意外丢失1. 消息持久化2. 队列持久化3. 发布确认3.1 简单发布确认3.2 批量发布确认3.3 异步发布确认 4…