当前位置: 首页 > news >正文

Effective C++ 条款33:避免遮掩继承而来的名称

文章目录

    • 条款33:避免遮掩继承而来的名称
      • 为什么避免遮掩?
      • 如何避免遮掩?
        • 1. 使用 `using` 声明式
        • 2. 使用转交函数 (Forwarding Functions)
      • 总结

条款33:避免遮掩继承而来的名称

在 C++ 中,派生类(derived class)内的名称会覆盖基类(base class)内的名称。这种行为通常被称为“遮掩”。在公共继承(public inheritance)中,通常不希望这种遮掩发生,因为它会导致基类的成员变得不可访问,这可能会使代码难以理解和维护。

为什么避免遮掩?

  1. 名称冲突:当派生类重定义了与基类相同的名称时,基类的成员将变得不可访问。这种现象可能会导致程序中的行为异常或意外错误。

  2. 降低可维护性:开发者可能不清楚在派生类中覆盖的成员是基类的成员还是派生类新定义的成员,导致理解代码时增加难度。

  3. 破坏继承契约:公有继承应该表现出“is-a”关系,派生类应作为基类的扩展。如果派生类覆盖了基类的成员,可能会破坏这种继承关系。

如何避免遮掩?

为了让基类中的成员不被遮掩并能够重新访问,可以使用以下方法:

1. 使用 using 声明式

可以使用 using 声明式将基类中的成员引入派生类,使得它们可以被访问。这样,派生类中的名称将不会覆盖基类的名称。

class Base {
public:void func() { std::cout << "Base func\n"; }
};class Derived : public Base {
public:using Base::func;  // 引入 Base 中的 func 函数void func(int x) { std::cout << "Derived func " << x << "\n"; }
};int main() {Derived d;d.func();       // 调用 Base::funcd.func(10);     // 调用 Derived::func
}

在上面的例子中,Derived 类通过 using Base::func; 语句引入了基类中的 func() 函数,这样就能同时使用派生类和基类的同名函数。

2. 使用转交函数 (Forwarding Functions)

当派生类中有同名函数时,如果你希望让基类的成员在派生类中保持可访问性,可以在派生类中编写转交函数,将请求转发到基类的实现。

class Base {
public:void func() { std::cout << "Base func\n"; }
};class Derived : public Base {
public:void func() { Base::func(); }  // 转交基类的 func
};int main() {Derived d;d.func();  // 调用 Base::func
}

在这个例子中,Derived 类的 func() 函数将调用 Base::func(),从而确保基类的成员函数仍然可用。

总结

  • 避免遮掩:在公有继承中,派生类不应遮掩基类的成员。如果必须使用同名成员,确保能够访问基类的成员。
  • 使用 using 声明式:可以通过 using 声明式引入基类成员,避免它们被遮掩。
  • 使用转交函数:通过转交函数将基类的成员调用转发到派生类,确保基类的接口仍然可访问。

遵守这一条款,可以提高代码的可读性、可维护性,并减少因遮掩带来的潜在错误。

相关文章:

Effective C++ 条款33:避免遮掩继承而来的名称

文章目录 条款33&#xff1a;避免遮掩继承而来的名称为什么避免遮掩&#xff1f;如何避免遮掩&#xff1f;1. 使用 using 声明式2. 使用转交函数 (Forwarding Functions) 总结 条款33&#xff1a;避免遮掩继承而来的名称 在 C 中&#xff0c;派生类&#xff08;derived class&…...

UEFI Spec 学习笔记---4 - EFI System Table(1)

4 - EFI System Table 本章节主要介绍的是 UEFI Image 的 Entry point&#xff08;在 UEFI 固件执行的时候&#xff0c;都是直接调用入口函数并且执行从而调用其他的 driver&#xff09;。 UEFI Image 主要是有三类&#xff1a;UEFI boot service driver、UEFI runtime drive…...

【微信小程序】3|首页搜索框 | 我的咖啡店-综合实训

首页-搜索框-跳转 引言 在微信小程序中&#xff0c;首页的搜索框是用户交互的重要入口。本文将通过“我的咖啡店”小程序的首页搜索框实现&#xff0c;详细介绍如何在微信小程序中创建和处理搜索框的交互。 1. 搜索函数实现 onClickInput函数在用户点击搜索框时触发&#x…...

独一无二,万字详谈——Linux之文件管理

Linux文件部分的学习&#xff0c;有这一篇的博客足矣! 目录 一、文件的命名规则 1、可以使用哪些字符&#xff1f; 2、文件名的长度 3、Linux文件名的大小写 4、Linux文件扩展名 二、文件管理命令 1、目录的创建/删除 &#xff08;1&#xff09;、目录的创建 ① mkdir…...

React:前端开发领域的璀璨之星

亲爱的小伙伴们&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你对深度学习的奥秘、Java 与 Python 的奇妙世界&#xff0c;亦或是读研论文的撰写攻略有所探寻&#x1f9d0;&#xff0c;那不妨给我一个小小的关注吧&#x1f970;。我会精心筹备&#xff0c;在未来…...

C/C++ 数据结构与算法【哈夫曼树】 哈夫曼树详细解析【日常学习,考研必备】带图+详细代码

哈夫曼树&#xff08;最优二叉树&#xff09; 1&#xff09;基础概念 **路径&#xff1a;**从树中一个结点到另一个结点之间的分支构成这两个结点间的路径。 **结点的路径长度&#xff1a;**两结点间路径上的分支数。 **树的路径长度&#xff1a;**从树根到每一个结点的路径…...

基于NodeMCU的物联网窗帘控制系统设计

最终效果 基于NodeMCU的物联网窗帘控制系统设计 项目介绍 该项目是“物联网实验室监测控制系统设计&#xff08;仿智能家居&#xff09;”项目中的“家电控制设计”中的“窗帘控制”子项目&#xff0c;最前者还包括“物联网设计”、“环境监测设计”、“门禁系统设计计”和“小…...

喜报 | 擎创科技入围上海市优秀信创解决方案

近日&#xff0c;由上海市经信委组织的“2024年上海市优秀信创解决方案”征集遴选活动圆满落幕&#xff0c;擎创科技凭借实践经验优秀的《擎创夏洛克智能预警与应急处置解决方案》成功入选“2024年上海市优秀信创解决方案”名单。 为激发创新活力&#xff0c;发挥标杆作用&…...

windows10下使用沙盒多开uiautoanimation可行性验证

文章目录 ⭐前言⭐sandboxie下载使用⭐pyinstaller打包python的uiautoanimation成exe⭐结论⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享windows下使用沙盒多开uiautoanimation可行性验证。 背景 实现多开应用程序从而进行自动化控制&#xff0c;批量处理大…...

电脑报错wsdprintproxy.dll丢失?修复wsdprintproxy.dll文件缺失的实用方法

在使用电脑的过程中&#xff0c;我们可能会遇到各种各样的错误提示&#xff0c;其中之一就是系统提示wsdprintproxy.dll文件丢失。这个DLL文件是Windows操作系统中的一个重要组件&#xff0c;它通常与Windows的打印功能相关。当这个文件丢失或损坏时&#xff0c;可能会导致打印…...

Kubernetes 的资源管理方式

集群架构 Docker 是每一个节点&#xff08;包括 Master 节点和 Node 节点&#xff09;的运行时环境。 kubelet 负责控制所有容器的启动和停止等&#xff0c;保证每个节点&#xff08;包括 Master 节点和 Node 节点&#xff09;正常工作&#xff0c;并且帮助 Node 节点和 Maste…...

layui动态拼接生成下拉框验证必填项失效问题

利用 jQuery 动态拼接下拉框时&#xff0c;lay-verify"required" 失效了&#xff0c;有以下几种原因。 1. <form></form>标签 加入 layui 类&#xff0c;class"layui-form" 。提交按钮上加自动提交&#xff0c;lay-submit ""; 。需…...

VUE3+VITE简单的跨域代理配置

出于安全考虑&#xff0c;未设置前端白名单&#xff0c;前端开发时&#xff0c;需要配置代理。 在本地创建一个虚拟服务器&#xff0c;发送请求数据&#xff0c;同时接受请求的数据&#xff0c; 利用服务器与服务器间&#xff0c;交互&#xff0c;不会有跨域问题&#xff0c;也…...

Xdebug

1、开启xdebug扩展 2、修改一下php.ini文件 xdebug.remote_enable 1 xdebug.remote_autostart 13、vscode安装插件php debug 4、生成launch.json文件&#xff0c;好像啥都不用改 5、vscode没有配置php路径的&#xff0c;需要去配置&#xff1a; 6、发起请求 8、代码断…...

IDEA | SpringBoot 项目中使用 Apifox 上传接口

目录 1 安装 Apifox Helper 插件2 获取 Apifox 的 API 访问令牌3 IDEA 中设置 API 访问令牌4 IDEA 中上传接口5 常见问题5.1 如何自动设置目录名5.2 如何自动设置接口名5.3 如何更改上传位置 Apifox 官方指南&#xff1a; https://apifox.com/help/applications-and-p…...

列表分页返回对象

列表分页返回对象 仅针对于新项目&#xff0c;因为一般进入公司后项目都是已经搭建好的&#xff0c;只需要在原有框架基础上操作就可以了&#xff0c;但是遇到从0开始的项目并且还没有架构需要自己搭框架的时候就需要自己想办法找各种封装格式。 下面记录分页列表返回的封装格式…...

微软edge浏览器 v131.0.2903.99便携版

前言 Microsoft Edge浏览器是个新浏览器&#xff0c;它用起来很简单&#xff0c;界面也很清爽。这个浏览器功能特别多&#xff0c;里面还带了微软的小助手Contana&#xff0c;能帮用户做不少贴心的事儿。它支持安装各种小工具&#xff08;插件&#xff09;&#xff0c;还能在网…...

Prometheus 专栏 —— Prometheus入门介绍

Prometheus 是? Prometheus 是一个开源的服务监控系统和时序数据库&#xff0c;主要用于收集、存储、查询和告警时间序列数据&#xff0c;这些数据通常反映了系统或者应用的状态或性能 Prometheus 的基本功能是? 数据采集数据存储数据查询告警通知 Prometheus 监控核心组件?…...

元宇宙在教育行业主要有哪些应用场景?

近两年来&#xff0c;元宇宙风潮在全球范围内迅速掀起了一股新的浪潮&#xff0c;“元宇宙”已成为各行各业探索新发展方向的热门话题&#xff0c;教育行业亦不例外。那么元宇宙在教育行业主要有哪些应用场景呢&#xff1f; 以下为主要适用场景&#xff1a; 课程实践&#xff…...

JZ31 栈的压入、弹出序列

题目来源&#xff1a;栈的压入、弹出序列_牛客题霸_牛客网 题目&#xff1a;如下 输入两个整数序列&#xff0c;第一个序列表示栈的压入顺序&#xff0c;请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序&#xf…...

中文大模型实战测评:MiniMax、GLM、Kimi谁更适合你的需求?(附详细对比表)

中文大模型实战测评&#xff1a;MiniMax、GLM、Kimi谁更适合你的需求&#xff1f; 当企业技术团队或个人开发者面临中文大模型选型时&#xff0c;往往陷入"参数崇拜"与"场景适配"的矛盾中。本文基于三个月真实项目测试数据&#xff0c;从工程落地视角拆解三…...

终极视频修复指南:如何使用Untrunc轻松恢复损坏的MP4/MOV文件

终极视频修复指南&#xff1a;如何使用Untrunc轻松恢复损坏的MP4/MOV文件 【免费下载链接】untrunc Restore a truncated mp4/mov. Improved version of ponchio/untrunc 项目地址: https://gitcode.com/gh_mirrors/un/untrunc 你是否曾经遇到过珍贵的视频文件突然无法播…...

农业AI实践:OpenClaw+Qwen2.5-VL-7B识别病虫害图片

农业AI实践&#xff1a;OpenClawQwen2.5-VL-7B识别病虫害图片 1. 为什么选择OpenClaw做农业病虫害识别&#xff1f; 去年夏天&#xff0c;我在自家后院种植的番茄突然出现叶片发黄、边缘卷曲的现象。作为非专业农户&#xff0c;我翻遍植物病理学资料仍无法确诊&#xff0c;直…...

如何快速解锁NCM音乐格式:ncmppGui完全指南

如何快速解锁NCM音乐格式&#xff1a;ncmppGui完全指南 【免费下载链接】ncmppGui 一个使用C编写的极速ncm转换GUI工具 项目地址: https://gitcode.com/gh_mirrors/nc/ncmppGui 你是否曾经遇到过这样的情况&#xff1a;从音乐平台下载的歌曲只能在特定应用中播放&#x…...

JNI内存泄漏吞噬GPU显存,Java AI服务OOM频发,一线工程师紧急封堵的4类隐蔽陷阱

第一章&#xff1a;Java AI 推理调试Java 在 AI 推理场景中常通过 ONNX Runtime、Deep Java Library&#xff08;DJL&#xff09;或 TensorFlow Java API 集成模型。调试过程需聚焦于输入张量形状匹配、数据类型一致性、设备绑定状态及推理结果可信度验证。启用详细日志输出 DJ…...

腾讯 CodeBuddy 全形态解析:IDE、CLI 与插件如何重塑 AI 编程体验

1. CodeBuddy 三形态全景解析&#xff1a;从终端到桌面的AI编程革命 第一次用CodeBuddy的CLI工具时&#xff0c;我在终端里输入"帮我写个Python爬虫抓取天气数据"&#xff0c;三秒钟后看着自动生成的完整代码&#xff0c;手里的咖啡差点洒在键盘上。这就是腾讯CodeB…...

ai赋能开发:在快马平台用自然语言描述,自动生成java swing计算器代码

最近想用Java Swing开发一个图形化计算器&#xff0c;但作为初学者对Swing库不太熟悉。好在发现了InsCode(快马)平台&#xff0c;它内置的AI辅助开发功能帮我轻松解决了这个问题。整个过程就像有个编程助手在实时指导&#xff0c;特别适合我这种想快速实现功能但又不想深陷语法…...

Phi-4-Reasoning-Vision镜像使用指南:双卡负载均衡与CUDA内存优化技巧

Phi-4-Reasoning-Vision镜像使用指南&#xff1a;双卡负载均衡与CUDA内存优化技巧 1. 工具概述 Phi-4-Reasoning-Vision是基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具&#xff0c;专为双卡4090环境优化设计。这个工具能够充分发挥15B大模型的深度推…...

突破限制:3大核心功能让MediaCreationTool.bat成为Windows安装自由的终极解决方案

突破限制&#xff1a;3大核心功能让MediaCreationTool.bat成为Windows安装自由的终极解决方案 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/Media…...

极速打造你的随身游戏宝库:Playnite便携版实战秘籍

极速打造你的随身游戏宝库&#xff1a;Playnite便携版实战秘籍 【免费下载链接】Playnite Video game library manager with support for wide range of 3rd party libraries and game emulation support, providing one unified interface for your games. 项目地址: https:…...