条款33:避免遮掩继承而来的名称(Avoid hiding inherited names)

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

1.1 提出问题

  1. 名称在C++中,实际上与继承无关。它与范围有关。
int x; // 全局变量
void someFunc()
{double x; 		// 局部变量std::cin >> x; 	// 读取本地x的新值
}
  1. 继承里的名称,实际工作的方式是,派生类的作用域嵌套在其基类的作用域内。
//Base的作用域 x、mf1(2)、mf2、mf3(2)
class Base {
private:int x;
public:virtual void mf1() = 0;virtual void mf1(int);virtual void mf2();void mf3();void mf3(double);...
};
//Derived的作用域 mf1、mf3、mf4
class Derived : public Base {
public:virtual void mf1();void mf3();void mf4();...
};//名称隐藏值取决于名称本身
Derived d;
int x;
...
d.mf1(); // 没问题, 调用 Derived::mf1
d.mf1(x); // 错误! Derived::mf1隐藏Base::mf1
d.mf2(); // 没问题, 调用 Base::mf2
d.mf3(); // 没问题, 调用 Derived::mf3
d.mf3(x); // 错误! Derived::mf3隐藏Base::mf3

1.2 解决办法

由于名称掩盖问题,派生类无法使用来自基类的重载函数,一种解决方法是使用using关键字:

//Base的作用域 x、mf1(2)、mf2、mf3(2)
class Base {
private:int x;
public:virtual void mf1() = 0;virtual void mf1(int);virtual void mf2();void mf3();void mf3(double);...
};
//Derived的作用域 mf1(2)、mf3(2)、mf4
class Derived : public Base {
public:using Base::mf1; // 让Base中所有名为mf1和mf3的东西using Base::mf3; // 在Derived的作用域中可见(并且是public)virtual void mf1();void mf3();void mf4();...
};
Derived d;
int x;
...
d.mf1(); 	// 还是没问题,  调用 Derived::mf1
d.mf1(x); 	// 现在可以了, 调用 Base::mf1
d.mf2(); 	// 还是没问题, 调用 Base::mf2
d.mf3(); 	// 没问题, 调用 Derived::mf3
d.mf3(x); 	// 现在可以了, 调用 Base::mf3

若不想打开函数的全部版本(在private继承时有意义),这时需要一个简单的转发函数:

class Base {
public:virtual void mf1() = 0;virtual void mf1(int);... // as before
};
class Derived : private Base {
public:virtual void mf1(){ // 一个简单的转发函数 Base::mf1();} ...
};
...
Derived d;
int x;
d.mf1(); 	// 没问题, 调用 Derived::mf1
d.mf1(x); 	// 错误! Base::mf1() 被隐藏了

1.3 总结

  1. 派生类中的名称隐藏基类中的名称。在公共继承下,这是不可取的。
  2. 要使隐藏的名称再次可见,请使用using声明或转发函数。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决Windows无法同时使用有线网和无线网WIFI的问题

参考资料 电脑无线网wifi和有线网同时使用(内网外网同时使用)用route命令解决Wifi和网卡不能同时上内外网问题 解决方法 对于Windows系统同时连接有线网和无线网Wifi时,只会有一个网关生效,因此我们需要手动通过route命令设置网…

2025常见的软件测试面试题

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 “ 今天我给大家介绍一些python自动化测试中常见的面试题,涵盖了Python基础、测试框架、测试工具、测试方法等方面的内容,希望能够帮助…

uni.getLocation+百度地图,报错getLocation:fail translate coordinate system faild

问题描述: 经测验,在type传入gcj02时才会报错,要使用gcj02就要配置地图key,没配置,uni.getLocation就会忽略type参数。 当key配置的是百度地图时type传入gcj02会报错。 还有就是不能在谷歌浏览器使用,不然调…

SickOs1.1

下载安装 名称:SickOs:1.1 发布日期:2015 年 12 月 11 日作者: D4rk系列:SickOs sick0s1.1.7z(大小:623 MB)下载(镜像): https: //download.vulnhub.com/sick…

基于卷积神经网络的甲状腺结节识别系统,resnet50,mobilenet模型【pytorch框架+python源码】

更多目标检测、图像分类识别、目标追踪等项目可看我主页其他文章 功能演示: 甲状腺结节识别系统,卷积神经网络,resnet50,mobilenet【pytorch框架,python源码】_哔哩哔哩_bilibili (一)简介 …

自动化文档处理:Azure AI Document Intelligence

Azure AI Document Intelligence支持多种文件格式,包括PDF、JPEG、PNG等。其核心功能是将这些文档按页进行内容提取,并转化为LangChain文档。其默认输出格式是Markdown,这使得文档可以通过MarkdownHeaderTextSplitter进行语义分片。您也可以使…

在 Ubuntu 24.04.1 LTS | Python 3.12 环境下部署 Crypto 库

测试一些密码学方案需要用到 Crypto 库,网上教程大多针对 Windows 和 Python 3.10 或以下的环境,所以写下了这篇博文。 部署与使用 首先执行 su 输入密码进入超级用户,部署完 Python 3.12 环境后,执行以下命令进行安装&#xff…

初学stm32 --- FSMC驱动LCD屏

目录 FSMC简介 FSMC框图介绍 FSMC通信引脚介绍 FSMC_NWE 的作用 FSMC_NWE 的时序关系 FSMC_NOE 的含义 FSMC_NOE 的典型用途 FSMC_NOE 的时序关系 使用FSMC驱动LCD FSMC时序介绍 时序特性中的 OE ILI9341重点时序: FSMC地址映射 HADDR与FSMC_A关系 LCD的…

Oracle 数据库 dmp文件从高版本导入低版本的问题处理

当前有个需求是将oracle 19c上的数据备份恢复到oracle 11g上使用。我们通过exp命令远程进行备份,然后通过imp进行恢复时出现IMP-00010: not a valid export file, header failed verification报错。 这是数据库版本问题,在使用exp命令导出的时候使用的客…

VScode怎么重启

原文链接:【vscode】vscode重新启动 键盘按下 Ctrl Shift p 打开命令行,如下图: 输入Reload Window,如下图:

NLP自然语言处理——使用飞桨实现基于LSTM的情感分析

任务说明: 通过对电影评论历史数据分析,构建深度学习分类模型,最终完成对新的数据样本的识别分类。 任务要求: 运用神经网络算法,创建、训练、评估模型,完成对电影评论的情感分类任务。 数据集说明&#xf…

百度热力图数据处理流程Arcgis PRO篇,Arcgis,QGIS见链接其他文章

目录 0、Arcgis,Arcgis Pro,QGis软件选择1、Arcgis,QGIS软件数据处理教程(最近太忙后续更新)1.1、Arcgis篇操作1.2、QGIS篇操作 2、Arcgis PRO 百度热力图数据处理流程!!!&#xff0…

从底层源码剖析AQS的来龙去脉!

文章目录 一、AQS概述二、AQS底层结构2.1 AQS底层基本变量2.2 Node节点结构2.3 FIFO队列 三、源码分析3.1 lock3.1.1 lock3.1.2 acquire3.1.2.1 tryAcquire3.1.2.2 addWaiter3.1.2.3 acquireQueued3.1.2.4 selfInterrupt 3.2 unlock 四、写在最后 一、AQS概述 谈到并发&#x…

运动健康小程序SpringBoot+论文源码调试讲解

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的,在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值,吸引更多的访问者访问系统,以及让来访用户可以花费更多时间停留在系统上,则表明该系统设计得比较专…

【Linux网络编程】第十七弹---深入理解以太网与ARP协议:从帧格式到数据报解析

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、认识以太网 1.1、以太网帧格式 1.2、认识 MAC 地址 1.3、对比理解 MAC 地址和 IP 地址 1.4、认识 MT…

Java - 日志体系_Simple Logging Facade for Java (SLF4J)日志门面_SLF4J集成logback 及 原理分析

文章目录 Pre官网集成步骤POM依赖使用第一步:编写 Logback 的配置文件第二步:在代码中使用 SLF4J 原理分析1. 获取对应的 ILoggerFactory2. 根据 ILoggerFactory 获取 Logger 实例3. 日志记录过程 小结 Pre Java - 日志体系_Apache Commons Logging&…

引发C++程序内存泄漏的原因分析与排查方法总结

目录 1、概述 2、内存泄漏与程序的位数 3、调用哪些接口去动态申请内存? 4、引发内存泄漏的常见原因总结 4.1、通过malloc/new等动态申请的内存,在使用完后,没有调用free/delete去释放(也可能是调用了上面讲到的HeapAlloc或V…

仓颉编程语言:编程世界的 “文化瑰宝”

我的个人主页 在当今编程领域百花齐放的时代,各种编程语言争奇斗艳,服务于不同的应用场景和开发者群体。然而,有这样一种编程语言,它承载着独特的文化内涵,宛如编程世界里一颗熠熠生辉的“文化瑰宝”,那就…

【Java】Spring Bean生命周期讲解

Spring bean生命周期的重要性 了解bean生命周期有助于更好掌握Spring框架,理解其对bean实例的管理和创建方式。有助于解决bean相关问题,如循环依赖问题,利于编写健壮、灵活、易维护的应用程序。 bean definition概念 spring容器实例化时&…

物联网工厂可视化监控平台:为智能制造打造的可视化大屏

01行业背景 随着技术的不断进步,物联网(IoT)已经成为推动数字化转型的核心力量。物联网通过连接各种设备和传感器,实现数据的实时收集、传输和分析,为各行各业带来了革命性的变化。随着5G、云计算、大数据等技术的成熟…