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

news2024/11/19 18:32:18

我是荔园微风,作为一名在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深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vr全景在线虚拟展馆节约企业成本费用

博物馆作为人们了解历史、文化和艺术的重要场所,现在可以通过VR全景技术来进行展览,让参观者身临其境地感受历史文化的魅力。本文将介绍博物馆VR全景的特点、优势,以及如何使用VR全景技术来使得博物馆的展览和教育活动更丰富。 参观者可以对内…

【Linux】权限理解

Linux权限理解 shell外壳运行原理为什么我们不是直接访问操作系统?外壳程序的意义 权限的概念与操作用户的权限如何进行Linux下用户身份的切换? 角色和文件的权限权限是什么?Linux中文件的类型是如何被确定的?权限与角色的关系权限与文件属性…

玩机搞机---修改系统固件不开机 安卓13去除系统app签名验证的几种方法

谷歌在安卓13中对系统应用添加了一层校验验证,你如果修改了系统app.那么原有的签名加载后过不去验证,会导致进不去系统卡第一屏或者进入系统后修改的app错误等等故障。 Android 13增加了新的apk签名校验机制,现在开机中它会对所有系统分区&a…

Hive中怎样创建和查询视图信息?

视图是从数据库的数据表中选取出来的数据组成的逻辑窗口,它是一个虚拟机表。引入视图后,用户可以将注意力集中在关心的数据上,如果数据来源于多个基本表结构,并且搜索条件比较复杂时,需要编写的查询语句就会比较烦琐&a…

hivesql 将数据处理成复杂json

类型一 原数据:bankid是array类型 目标数据: {"bankname": ["SPDB", "WS_HBBANK", "mytest"],"grid": [{"name": "阶段1","values": ["38.0,1.0,1.0"]}…

安全生产月评选活动-优秀的“安全之星”,塑造榜样力量

安全生产月评选活动-优秀的“安全之星”,塑造榜样力量。 推荐功能:投票 企业可以举办安全生产月评选活动,选出优秀的“安全之星”,进行内部评选,塑造榜样力量。 首先,让我们先来了解一下“安全生产月评选活…

MYSQL各种log

本章纲要 1、mysql主从复制是怎么实现的(binlog,relaylog) 2、事物执行原理是怎么保证ACID的(redolog,undolog) 一、Mysql是怎么实现主从复制的 数据库主从设计的好处: 1、实现读写分离,方便扩展&#…

MySQL 磁盘爆了,是 optimize table 的锅

2023-06-26 22:17左右,收到某系统的主库磁盘使用率告警。2023-06-26 23:02左右收到该系统的从库磁盘使用率告警。 收到告警后,登录数据库查看各表的磁盘使用。 经分析发现DB存在一个当日的备份表t_eap_sys_navigation_log_bak_20230626 ,且在…

4077:出栈序列统计

codeup【递归入门】出栈序列统计_codeup编程_战斗的咸鱼的博客-CSDN博客 #include<iostream> using namespace std; int n,sum,ans; void dfs(int out,int in,int not_in){if(outn){ans;return;}if(in>0) dfs(out1,in-1,not_in);if(not_in>0&&in<n) dfs…

Vue模板编译

文章目录 导文Vue模板编译是什么&#xff1f;模拟编译模板总结 导文 Vue框架使用了模板编译的方式来将Vue模板转换为可执行的JavaScript代码。这个编译过程在运行时由Vue的编译器完成。 在Vue中&#xff0c;模板是以HTML标记的形式编写的&#xff0c;其中可以包含Vue的特殊语法…

【探索 Kubernetes|作业管理篇 系列 14】StatefulSet 存储状态

前言 大家好&#xff0c;我是秋意零。 在上一篇中&#xff0c;我们讲解了 StatefulSet 的拓扑状态&#xff1b;我们发现&#xff0c;它的拓扑状态&#xff0c;就是顺序启动/删除、Pod 名称编号命名、将 Pod 名称设为 Hostname 名称、通过 Service 无头服务的 DNS 记录访问。 …

基于Python的海量豆瓣电影、数据获取、数据预处理、数据分析、可视化、大屏设计项目(含数据库)

目录 项目介绍研究背景国内外研究现状分析研究目的研究意义研究总体设计网络爬虫介绍豆瓣电影数据的采集数据预处理大数据分析及可视化豆瓣影评结构化分析 大屏可视化文本可视化总结每文一语 项目介绍 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博…

虹科DataHub:连接工业自动化的桥梁,引领企业数字化转型

一、前言 随着智能制造、工业互联网等新一代信息技术的不断发展&#xff0c;IT和OT融合已成为未来制造业数字化转型的重要趋势。得益于开放的系统架构和创新的软件应用&#xff0c;OT&#xff08;工业自动化技术&#xff09;和信息技术&#xff08;IT&#xff09;系统之间的数…

在windows系统中映射网络驱动器时,如何通过非455端口远程访问Linux服务器的Samba服务

声明 通常情况下&#xff0c;在windows中通过Linux服务器的Samba服务去映射网络驱动器时候&#xff0c;一般默认就是直接填入内网Linux服务器ip即可&#xff0c;它会默认445端口。若是我的windows并不和Linux服务器在一个网段时&#xff0c;该如何操作呢&#xff1f; 1 用管理…

一键转发微信好友朋友圈,自动跟圈

今天咱来讲一下如何实现一键转发朋友圈&#xff1f; 如何一键跟圈&#xff0c;多个微信快速同步发圈&#xff1f; 01 一键转发 浏览朋友圈&#xff0c;在此页面可以浏览所登录的微信号的好友朋友圈&#xff0c;可以实现快速点赞、评论、一键转发。 单击“转发”即可跳转到发…

D. Optical Experiment

题意&#xff1a; D. 光学实验 时间限制&#xff1a;5秒 内存限制&#xff1a;256兆字节 输入&#xff1a;标准输入 输出&#xff1a;标准输出 Phunsuk Wangdu教授进行了一些关于光线的实验。n条光线的实验装置如下&#xff1a; 有一个长方形盒子&#xff0c;在相对的两面…

windows的环回网卡(loopback adapter) 安装方法

0.说明&#xff1a;windows的环回网卡(loopback adapter)的作用&#xff1a; microsoft loopback adapter就是安装在本机上的一块虚拟网卡&#xff0c;它跟本机上的其它物理网卡、和物理网卡连接的网络是没有关系的&#xff0c;你可以理解成这块网卡上的网线接到了另外一个空白…

葡萄风味有奥秘,农科院用机器学习揭示基因渐渗过程

内容一览&#xff1a;基因渐渗与葡萄的驯化、遗传改良密切相关。先前研究揭示了欧洲栽培葡萄中&#xff0c;野生葡萄基因渐渗的基因组信号&#xff0c;但尚未深入研究这些渐渗事件发生的时间、方式、基因组模式和生物学效应。本文中&#xff0c;中国农业科学院深圳农业基因组研…

【杂谈理解】电源芯片设计选型

前言 看B站UP主达尔闻关于电源视频&#xff0c;做的笔记。下述内容中&#xff0c;如有芯片比较皆是性能层面的比较&#xff0c;暂未考虑成本。且老师在视频中&#xff0c;也多次建议说&#xff0c;可以多关注比较新兴的芯片&#xff0c;一般会是有更好的性能。讲的真的很好&…

【MySQL】MySQL数据库,RDBMS 术语,使用说明和报错解决的详细讲解

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…