[Effective C++]条款33 继承, 重载与作用域

news/2024/12/18 1:39:13/

本文初发于 “天目中云的小站”,同步转载于此。

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

本条款并非和继承有关, 而是在讨论由继承引发的作用域问题, 其有可能破坏条款32所确定的法则, 因此我们在其之后介绍本条款。

我们知道在不同作用域下如果有相同名称的事物, 无论其功能或类型, 都是局部优先的. 继承的父子类也是类似, 不管是不是虚函数, 亦或是纯虚函数都完全没有关系, 都遵守相同名称局部优先的原则, 我们来看看一下的代码 :

class Base {
private:int x;
public:virtual void mf1() = 0;virtual void mf2();void mf3();...
};class Derived: public Base {
public:virtual void mf1() override;virtual void mf2() override;...
};

分析代码我们可以发现, 派生类的函数都将覆盖基类相同名称的函数, 但没有什么原则上的问题.

但是如果加入重载, 事情就变得有些复杂了, 我们来看看接下来的代码 :

class Base {
private:int x;public:virtual void mf1() = 0;virtual void mf1(int);  // mf1的重载virtual void mf2();void mf3();void mf3(double);  // mf3的重载...
};class Derived: public Base {
public:virtual void mf1();void mf3();...
};

我们经过测试发现, 派生类调用mf1将只能调用到Derived中的mf1(), mf3也是如此, 而基类中的重载版本将无法再获取(除非用Base::). 以下我们将会介绍两种应用于不同情况下的解决办法.


using声明式

让我们回顾条款32 : “public意味is-a” , 也就是说派生类可以干出所有Base可以干的事, 但是在这种情况下, 基类可以使用mf1(int), 而派生类却不可, 这便是打破了这个规则. 因此我们可以再在派生类重写对应的重载, 亦或是直接接受父类的重载版本, 就像如下代码 :

class Derived: public Base {
public:using Base::mf1;       using Base::mf3;      // 所有Base中的mf1和mf2在Derived中都可见virtual void mf1();void mf3();void mf4();...
};

如此便可避免遮掩继承而来的名称.


转交函数

public继承可以通过using暴露所有基类的名称及其对应的重载版本, 但当然也会有private继承(具体细节在条款39中讲解)有类似的需求, 但private继承不一定需要继承所有基类的重载版本, 可能只是某个被遮掩的版本, 于是我们可以通过转交函数, 来缩小获取的范围, 让我们看以下代码 :

class Base {
public:virtual void mf1() = 0;virtual void mf1(int);...                                   
};class Derived: private Base {
public:virtual void mf1(){ Base::mf1(); }                     // 转交给基类, 选取其中的无参数版本...
};

这样mf1就只会有基类无参数版本的mf1对应的功能, 而使用不到带int的重载版本.


请记住 :

  • 派生类中的名称会遮掩基类中的名称.
  • public继承必须接受所有基类中所有被遮掩的名称, 故用using声明式.
  • private继承中可能有需要基类中被遮掩物的需求, 可以用转交函数声明调用基类函数.

by 天目中云


http://www.ppmy.cn/news/1556006.html

相关文章

海康威视监控web实时预览解决方案

海康威视摄像头都试rtsp流,web页面无法加载播放,所以就得转换成web页面可以播放的hls、rtmp等数据流来播放。 一:萤石云 使用萤石云平台,把rtsp转化成ezopen协议,然后使用组件UIKit 最佳实践 萤石开放平台API文档 …

使用 imageio 库轻松处理图像与视频

使用 imageio 库轻松处理图像与视频 imageio 是一个 Python 库,用于读取和写入多种图像和视频格式。它功能强大、易于使用,广泛应用于图像处理、视频编辑和数据可视化等领域。本篇文章将介绍 imageio 的基础功能、常见用法以及高级操作。 一、安装 imag…

亚远景-ASPICE实施策略:构建高效汽车软件质量保证体系

ASPICE(Automotive SPICE)是一个针对汽车行业软件过程改进的国际标准,它旨在提高汽车软件的质量和可靠性。实施ASPICE通常需要一个系统性的策略,以下是一些关键的步骤和策略: 一、了解ASPICE 基本概念与要求&#xff…

智能家居WTR096-16S录放音芯片方案,实现语音播报提示及录音留言功能

前言: 在当今社会的高速运转之下,夜幕低垂之时,许多辛勤工作的父母尚未归家。对于肩负家庭责任的他们而言,确保孩童按时用餐与居家安全成为心头大事。此时,家居留言录音提示功能应运而生,恰似家中的一位无形…

鸿蒙NEXT开发案例:九宫格随机

【引言】 在鸿蒙NEXT开发中,九宫格抽奖是一个常见且有趣的应用场景。通过九宫格抽奖,用户可以随机获得不同奖品,增加互动性和趣味性。本文将介绍如何使用鸿蒙开发框架实现九宫格抽奖功能,并通过代码解析展示实现细节。 【环境准…

AI 智能名片 S2B2C 商城小程序在社群团购运营中的作用与价值

摘要:本文深入探讨了 AI 智能名片 S2B2C 商城小程序在社群团购运营中的重要作用。随着社群团购的兴起,如何有效运营成为关键问题。AI 智能名片 S2B2C 商城小程序凭借其独特功能,能够在促进消费者互动、提升产品传播效果、影响购买决策以及实现…

NLP大模型学习总结

参考课程 【清华NLP】刘知远团队大模型公开课全网首发|带你从入门到实战-知乎 一、自然语言处理基础 1.1 自然语言处理的基本任务 让计算机理解人所说的文本 语音 词性标注:区分每个词名词、动词、形容词等词性命名实体的识别:名词的具体…

6.2 MapReduce工作原理

MapReduce工作原理涉及将大数据集分割成小块并行处理。Map任务读取数据块并输出中间键值对,而Reduce任务则处理这些排序后的数据以生成最终结果。MapTask工作包括读取数据、应用Map函数、收集输出、内存溢出时写入磁盘以及可选的Combiner局部聚合。ReduceTask工作则…