父类和子类

2023-11-13

尽管很多知名译本都把C++面向对象里有继承关系的类称作基类和派生类,但人们很多口语化的表达里还是叫他们父类和子类,毕竟...你继承了我嘛,非亲非故的,谁让你继承。

恰逢今天父亲节,我们就来聊聊C++里对父亲和儿子这一关系的设计。读程序,品人生。

什么东西你不能给儿子分享,却可以跟朋友一诉衷肠?

当然是父辈间的一些隐私啦。

1

回想起我学C++面向对象的时候,正好是《琅琊榜》风靡全国之际。可惜我那会儿沉迷美剧《权力的游戏》,整体张口闭口兰尼斯特有债必偿,分析维斯特洛第一搅屎棍的阴险计谋,震惊血色婚礼的血腥绝望,感叹剧组服化道的极致奢华,对这部国产剧并不感冒。

可我家那位是胡歌的铁粉,已经看了琅琊榜不下二十遍,而且每次看苏哥哥都是花痴脸星星眼。终于在她刷第二十一次的时候,我也陪她看了一遍。

剧里描述了两代人的恩怨故事,父辈代表有皇帝梁王,将军林燮,侯爷言阙、谢玉,特务科首领夏江,江湖势力卓鼎风。儿辈代表有梅长苏,靖王,誉王,萧景睿,言豫津。

父辈之间有很多故事,很多秘密。而这些秘密,隐私他们会跟朋友分享,跟朋友合谋,跟朋友商量。都是他们那一代人的风流韵事,前尘过往,没必要让小辈知道。

所以谢玉跟夏江联手杀了林燮,跟卓鼎风密谋刺杀梅长苏,言侯爷跟道士设计炸死皇帝,都是他们父辈之间private的秘密,绝对不会让儿子知道。

多少人身陷险境,都是因为知道的太多了。不让你知道,不让你访问,本质上,也是一种protected

所以小时候你无数次被人怼说“大人的事小孩别插嘴,不该问的别问”时,就是因为你企图去访问父类的private成员,被系统报错警告了一次。

C++里对于父类子类友元类访问控制的设计,跟上文所述异曲同工,不可谓不精妙。

2

一个类里的成员属性可分为public、private、protected

public顾名思义为公开,是一些可以暴露给外界的东西。譬如你的名字,毕业院校,工作经验,专业方向,你的履历等等这些是可以公开的告诉公司的,别人通过你本人访问你的这些属性也理所应当。

但同样,有public就有private。你三岁尿床,八岁拉裤子,十五岁翻墙去网吧,上周还去医院看过肛肠科这些隐私我觉得没必要公开吧......别人若想通过你本人访问这些隐私,建议直接一个白眼翻回去。

不过,你本人虽然不允许别人访问private隐私,但别人可以通过谁知道你的隐私呢?当然是你的那些管不住嘴的狐朋狗友们,是不是很符合逻辑。

人生在世,每个人都是孤独的个体,都需要朋友来分享喜怒哀乐,商量生活琐事。谁还没几个从穿开裆裤一起玩到大的好朋友,谁还没一些可以互诉衷肠的知己红颜。

所谓你是我最坚硬的盔甲,同时也是我最柔软的软肋

我公开的东西,大家都可以访问;我保护的东西,我,我儿子和我的朋友可以访问,我的隐私,只有我和我的朋友可以访问。

简单来讲,我的一切,我的朋友都可以访问。

嗯,设计这个特性的人,一定对朋友很好,重情重义。

同样,在C++里,一个类的所有成员,该类的友元类friend class都可以访问。而private成员,只有友元类可以访问使用。

不过朋友这个事呢,是单向的。你拿人家当朋友,人家不一定拿你当朋友。萧景睿把梅长苏当朋友,把自己的后背完全交给了他,但梅长苏的秘密景睿却一无所知。

所以C++类里,friend class也是单向的,我可以访问你的隐私,不代表你可以访问我的。除非我也声明你是我的friend。很合理吧。

fiend class也不具备传递性,即我跟你是朋友,但我的另一个朋友却不一定跟你是朋友,除非你也声明他是你的friend。很合理吧。

所以你在设计类的时候,如果有些属性你不希望暴露给所有人,但又不得不让某些指定的模块使用,那就把这些成员划分到private属性里,同时把需要访问这些成员的模块声明为该类的友元类或友元函数

举一个实际代码的例子:

class Base{
    public:
      int GetMyName();
    protected:
      double GetMyMoney();
    private:
      std::string GetMySecret();

    friend class MyFriend;
};

class MyFriend{
    public:
      std::string TalkToEveryone(){
        Base base;
        return base.GetMySecret();      
      }
};

3

那么父亲虽然对朋友那么好,那么开诚布公,却还是不如对自己儿子亲。毕竟骨肉相连,血浓于水嘛。

朋友只能访问,儿子可以继承啊!所有public属性的东西,自然毫无意外的会留给儿子。

但刚才我也频繁提到了保护protected这个词,就是想加深你的印象。父亲对儿子,天然是有保护欲的。以及父亲会让自己继承自己的财产,财产也是受保护的吧。

所以父类和子类之间,牢记保护二字,牢记protected这个词。所有protected属性的成员,都是留给儿子的。而外人可用不到。

所以在设计类的时候,如果有些属性你不希望暴露给所有人,但你希望给子类留着,那就把这些成员都划分到protected属性里。

一个实际代码的例子:

class Base{
    public:
      int GetMyName();
    protected:
      double GetMyMoney();
    private:
      std::string GetMySecret();
};

class MySon:public Base{
    public:
      void SpendMoney(){
        double money = GetMyMoney(); 
        findGirls(money);     
      }
};

不过继承也是分级别的,C++里对类的继承分为public继承,protected继承,private继承三种,三者的访问权限也是由低到高的。

在按照某种权限方式继承时,会将权限低于自己的成员提升至跟自己同一级别,而无法将权限高于自己的成员拉低。

篇幅所限,虚函数,虚继承,虚表和虚指针这些,我们下次再详细聊聊。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

父类和子类 的相关文章

  • 具有子列表属性映射问题的自动映射器

    我有以下型号 Models public class Dish Required public Int64 ID get set Required public string Name get set Required public str
  • 为什么我不能用 `= delete;` 声明纯虚函数?

    Intro 纯虚函数使用通用语法声明 virtual f 0 然而 自 c 11 以来 有一种方法可以显式地传达non existence 特殊 成员函数的 Mystruct delete eg default constructor Q
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 当前的 c++ 工作草案与当前标准有何不同

    通过搜索该标准的 PDF 版本 我最终找到了这个链接C 标准措辞草案 http www open std org jtc1 sc22 wg21 docs papers 2012 n3376 pdf从 2011 年开始 我意识到我可以购买最终
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • Azure 事件中心 - 按顺序接收事件

    我使用下面的代码从 Azure Event Hub 接收事件 https learn microsoft com en us azure event hubs event hubs dotnet framework getstarted s
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • 如何在c#中的内部类中访问外部类的变量[重复]

    这个问题在这里已经有答案了 我有两个类 我需要声明两个类共有的变量 如果是嵌套类 我需要访问内部类中的外部类变量 请给我一个更好的方法来在 C 中做到这一点 示例代码 Class A int a Class B Need to access
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • 当“int”处于最大值并使用 postfix ++ 进行测试时,代码定义良好吗?

    示例 未定义行为的一个示例是整数溢出的行为 C11dr 3 4 3 3 int溢出是未定义的行为 但这是否适用于存在循环的以下内容 并且不使用现在超出范围的副作用i 特别是 这是否后缀增量规格帮助 结果的值计算在副作用之前排序 更新操作数的
  • 尚未处理时调用 Form 的 Invoke 时出现 ObjectDisposeException

    我们得到一个ObjectDisposedException从一个电话到Invoke在尚未处理的表格上 这是一些演示该问题的示例代码 public partial class Form2 Form void Form2 Load object
  • 结构体指针的动态数组

    我必须使用以下代码块来完成学校作业 严格不进行任何修改 typedef struct char firstName char lastName int id float mark pStudentRecord pStudentRecord
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • 带重定向标准流的 C# + telnet 进程立即退出

    我正在尝试用 C 做一个 脚本化 telnet 项目 有点类似于Tcl期望 http expect nist gov 我需要为其启动 telnet 进程并重定向 和处理 其 stdin stdout 流 问题是 生成的 telnet 进程在
  • 实例化 Microsoft.Office.Interop.Excel.Application 对象时出现错误:800700c1

    实例化 Microsoft Office Interop Excel Application 以从 winforms 应用程序生成 Excel 时 出现以下错误 这之前是有效的 但突然间它停止工作了 尽管代码和 Excel 版本没有变化 我
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder

随机推荐

  • 2020-11-07 layui图片层实现查看大图效果

    之前主要使用element ui和 ant design 框架来实现前端页面 后来在公司需要使用layui开发 一开始接触这个框架感觉美观程度不如之前用的element ui和antd 觉得layui不好用 比较抵触这个框架 后来用多了发现
  • 部署代码生成模型CodeGeeX2

    模型下载 大家需要从huggingface下载CodeGeex2的模型文件 可以直接下载到本地 也可以git clone 这里给huggingface的地址 大家自行下载 THUDM codegeex2 6b Hugging Face 模型
  • pytorch加载保存查看checkpoint文件

    參考以下 https blog csdn net joyce peng article details 104133594 ps 有大佬有CSDN转发博客的实操经验的麻烦分享下
  • GPU服务器上的tensorrt环境搭建

    GPU服务器上的tensorrt环境搭建 文章目录 GPU服务器上的tensorrt环境搭建 1 拉取docker服务器上的支持cuda cudnn的镜像文件 2 设置环境变量并下载相关依赖 2 1安装cuda和cudnn 2 2 pyto
  • python中 什么是描述符?

    文章目录 什么是描述符 动态查找 管理属性 set name 魔术方法 描述符定义 数据验证模块 自定义验证 Goods类的验证 总结 参考文档 什么是描述符 什么是描述符 描述符 是python中一个高级的特性 简单来说 是用来控制 对象
  • 最大化印刷MES管理系统价值,提升印刷车间效率与质量

    印刷MES管理系统 既是对ERP计划及车间现场管理的实时反馈及响应 更是制造执行过程中人 机 料 法 环等资源相互作用 相互配置的最优方案监控 可以让企业获得更多 更有利 更实用的生产制造数据 在这个过程当中 提升效率和质量 降低风险就是印
  • 30天自制操作系统(第02天)–汇编语言学习和MakeFile入门

    第二天 我们将之前的程序进一步翻译成汇编语言 进一步了解启动程序到底做了些啥 还记得第一天中有一部分程序主体么 以及最开头的代码 我们把它们翻译成汇编看看 hello os TAB 4 ORG 0x7c00 指名程序的装载地址 以下一段是标
  • 关于使用快慢指针进行单向链表环存在性判定的若干问题的进一步思考

    文章目录 面试官问这个问题的目的是什么 快慢指针的工作原理 快慢指针究竟几步可以定位环 快指针的速度只能是双倍速么 其他判定单向链表环路的方法 小结 费曼算法 1 写下这个问题 2 真正地努力思考 3 写下解决办法 物理学家Murray G
  • 苹果手机怎样批量删除照片

    https jingyan baidu com article 851fbc37953b183e1f15ab02 html 喜欢使用苹果手机拍照的朋友 会经常删照片 那怎样操作更快呢 今天就为大家分享苹果手机怎样批量删除照片 工具 原料 苹
  • git命令详解

    一 简介 git作为应用广泛的一种分布式版本控制系统 其与svn比较最大的差别就是一个是分布式 一个是集中式 git在每个开发者的本地有一个完整的版本库 当在本地处理工作时 无需联网便可修改提交 当需要与其它开发者交互时 只需要提交自己的修
  • 陀螺研究院×BSN丨解析区块链视角下的消费者权益保护访谈全文发布

    3月是我国消费者权益保护月 在近日播出的3 15晚会中 央视曝光了科勒卫浴 宝马 Max Mara多家知名商店安装人脸识别摄像头 手机清理软件泄露老人隐私 瘦肉精羊等多个极其恶劣的消费者权益侵害行为 可以看出 随着数据时代的渐行渐近 消费者
  • switch怎么切换服务器账号,任天堂eshop如何换区 switch账号如何切换其他服地区

    任天堂eshop里面的游戏因为注册地区不同 游戏的售价也相应不同 因为汇率的影响 游戏的售价产生了高低差价 这种差价可以让玩家买到较低价的游戏 操作起来方法就是在switch里进行账号切换 怎样切换任天堂账号地区呢 一起来看下吧 1 首先需
  • /usr/lib64/sa/sa1脚本解释

    usr lib64 sa sa1脚本解释 前言 脚本原文 脚本解释 附 前言 这个脚本是 Linux 系统上的 sysstat 工具的一部分 在 etc cron d sysstat这个定时任务下执行 用来收集系统性能数据 需要配合 etc
  • 休眠后网络无法自动连接——网卡属性没有电源管理选项

    问题描述 1 每次休眠过后网卡都是无法连接网络的状态 需要手动禁用 gt 开启网卡后才会恢复正常 2 同时网卡属性里没有电源管理选项 环境 Win10 网卡设备 realtek pcie gbe family controller 解决办法
  • 遗传算法超详细图解

    遗传算法 Genetic Algorithm 顾名思义 是一种基于自然选择原理和自然遗传机制的启发式搜索算法 该算法通过模拟自然界中生物遗传进化的自然机制 选择 交叉和变异操作 将好的遗传基因 最优目标 不断遗传给子代 使得后代产生最优解的
  • webpack对js文件和eslint做缓存处理

    一 什么是webpack的cache Webpack的缓存通常是指模块缓存和构建缓存 1 模块缓存 通过缓存模块的内容 可以避免重复读取和解析同一个模块的开销 Webpack默认是开启模块缓存的 即第一次编译时会将已经加载的模块信息缓存到内
  • MAX30102血氧模块检测心率和血氧

    1 完成 CubeMX初始化配置 1 1 利用CubeMX完成HAL库工程模板和初始化 通过选择芯片型号创建CubeMX工程 在弹出的对话框中输入开发板上的芯片型号 STM32F103RB 在右侧筛选栏中选择Tx型 即开发板上芯片所用的LQ
  • 7个高清图片素材网,免费/可商用

    1 菜鸟图库 https www sucai999 com pic html v NTYwNDUx 菜鸟图库是一个综合性素材网站 这里面有很多设计 图片 视频 音频等素材 图片素材全部都是高清无水印 基本都能免费下载 还有部分素材是可以商用
  • c#输出当前日期和当前时间_如何在C#中的当前日期时间添加小时数?

    我们在C 中使用DateTime类的AddHours 方法 Syntax 句法 DateTime DateTime AddHours double 以下C 代码在当前日期时间添加小时数 using System namespace Cons
  • 父类和子类

    尽管很多知名译本都把C 面向对象里有继承关系的类称作基类和派生类 但人们很多口语化的表达里还是叫他们父类和子类 毕竟 你继承了我嘛 非亲非故的 谁让你继承 恰逢今天父亲节 我们就来聊聊C 里对父亲和儿子这一关系的设计 读程序 品人生 什么东