《Effective C++》知识点(6)--继承与面向对象设计

32. 确定你的public继承模式是is-a关系

      重要规则:public继承就意味is-a的关系。适用于基类身上的每一件事情一定也适用于继承类身

      上,因为每一个继承类对象也都是一个基类对象。

      另外两种关系是has-a(有一个)和is-implemented-in-terms-of(根据某物实现出)。

33. 避免遮盖继承而来的名称

     33.1 编译器查找函数顺序:首先查找local作用域,没找到->查找外围作用域(继承类覆盖的),

             没找到->查找基类作用域,没找到->查找包含基类的namespace作用域,没找到->最后到

             global作用域找。

     33.2 继承类内的函数名称会遮盖基类内的函数名称。在public继承下违反了is-a的原则。

     33.3 为了让被遮盖的函数可见,可使用using声明式或转交函数(继承类函数里调用基类函数)。

34. 区分接口继承和实现继承

      接口继承和实现继承不同。在public继承下,继承类总是继承基类的接口。

接口继承实现继承
纯虚函数
非纯(impure)虚函数缺省实现(允许子类有不同行为)
非虚函数强制(不允许子类有不同行为)
35. 考虑虚函数以外的其它选择

      虚函数的替代方案:

方法设计模式优点缺点说明
non-virtual interface(NVI) 手法Template Method非虚函数包装了虚函数,可以在虚函数调用前及调用之后做一些工作对public的虚函数不适合通过public非虚成员函数调用private或protected虚函数
函数指针成员变量替换虚函数Strategy模式的分解表现

1.每个对象可各自拥有自己的计算函数

2.可在运行期改变使用哪个计算函数

需要弱化class的封装性,以便非成员函数访问类的非public成员函数指针指向非成员函数,这些函数有相同的参数和返回值。
tr1::function成员变量替换虚函数Strategy模式的某种形式比函数指针更加灵活function可以是函数指针、函数对象、或成员函数指针
将继承体系内的虚函数替换为另一继承体系内的虚函数Strategy模式的传统实现增加新的计算策略类很方便策略与对象分离
36. 绝不重新定义继承而来的non-virtual函数

       任何情况下继承类都不该重新定义一个继承而来的基类non-virtual函数。如果需要重新定义,

       那说明这个函数其实应该是virtual函数。

37. 绝不重新定义继承而来的缺省参数值

     37.1 可以重定义继承而来的带有缺省参数值的virtual函数实现,但不能重定义它的缺省参数

               值。因为virtual函数是动态绑定,而缺省参数值却是静态绑定。

     37.2 为什么缺省参数值是静态绑定?

               为了运行效率。如果缺省参数值是动态绑定,编译器就必须有某种办法在运行期为虚函

               数决定适当的参数缺省值。这比目前实行的"在编译期决定"的机制更慢而且更复杂。为了

               程序的执行速度和编译器实现上的简易度,C++做了这样的去舍。

     37.3 当你想令virtual函数表现出你所想要的行为但却遇到麻烦时,考虑条款35的替代设计。 

38. 通过复合实现has-a或"根据某物实现出"

     38.1 复合(composition)的意义和public继承完全不同。

     38.2 程序中的对象相当于现实世界的某些事物,这样的对象属于应用域。其它对象如缓冲区、

             互斥器、查找树等等,属于实现域。

             当复合发生于应用域内的对象之间,表现出has-a的关系;而当它发生于实现域内则是表现

             出is-implemented-in-terms-of的关系。

39. 明智而审慎地使用private继承

     39.1 private继承的两个规则:

            a. 编译器不会自动将一个继承类对象转换为基类对象。

            b. 继承来的所有成员,在继承类中都会变成private属性。

     39.2 private继承意味is-implemented-in-terms-of,只有实现部分被继承。它通常比复合

             (composition)的级别低。尽可能使用复合,必要时使用private继承。private继承主要用

             于"想访问基类的protected成分"或为了重新定义继承而来的虚函数。

     39.3 EBO(empty base optimization)空白基类最优化

             和复合不同,private继承可以EBO(一般只在单一继承)。这对致力于"对象尺寸最小化"的程

             序库开发者而言,可能很重要(在意空间的时候)。

     39.4 空的类Empty并非不占空间,在大多数编译器中sizeof(Empty)为1。

40. 明智而审慎地使用多重继承

    40.1 多重继承比单一继承复杂。它可能导致新的歧义性(多个基类有同名接口时),以及对virtual

            继承的需要(否则钻石型多重继承时会重复复制基类成员变量)。

    40.2 虚继承会增加大小、速度、初始化(及赋值)复杂度等等成本。如果虚基类不带任何数据,将

           是最具实用价值的情况。

    40.3 两个建议:

             a. 非必要不使用virtual bases。尽量使用非虚继承。

             b. 如果必须使用虚继承,尽可能避免在其中放置数据。   

    40.4 多重继承的用途之一:

            "public继承某个接口类"和"私有继承某个协助实现的类"的组合(类适配器)。
     

 

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

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

相关文章

[揭秘]splunk 背后running 的job

1: 背景: 最近客户总是会收到一些dashboard 的PDF 文件,有些内容不是想要的,想要求更新一下,但是问题来了,这些dashboard 的自动运行的job 在哪里呢? 2: 查找原因: 2.1 如果知道这个dashboard 发到那个email 的,那么可以查找: abc@163.com 去: /opt/splunk/etc/use…

【Redis】String字符串类型-常用命令

文章目录 String字符串类型常用命令setgetMGETMSET 计数命令INCRINCRBYDECRDECRBYINCRBYFLOAT 其它命令APPENDGETRANGESETRANGESTRLEN 命令总结 String字符串类型 1)⾸先Redis中所有的键的类型都是字符串类型 2)字符串类型的值(value&#…

数据结构详细笔记——并查集

文章目录 逻辑结构存储结构并、查代码实现Union 操作的优化Find 操作的优化(压缩路径) 逻辑结构 集合:将各个元素划分为若干个互不相交的子集的集合 森林是m(m>0)棵互不相交的树的集合 存储结构 #define SIZE 13 int UFSets[SIZE]; …

linux环境下编译,安卓平台使用的luajit库

一、下载luajit源码 1、linux下直接下载: a、使用curl下载:https://luajit.org/download/LuaJIT-2.1.0-beta3.tar.gz b、git下载地址;https://github.com/LuaJIT/LuaJIT.git 2、Windows下载好zip文件,下载地址:https…

云计算、大数据、人工智能、物联网、虚拟现实技术、区块链技术(新一代信息技术)学习这一篇够了!

目录 云计算 一、云计算的基本概念 二、云计算的分类 (一) IaaS (二) SaaS (三) PaaS 三、云环境的分类、云计算的四种部署模式 (一)公有云 (二)私有云 (三)社区云 (四)混合云 四、云计算的特点 (一)虚拟化技术 (二)动态可扩展 (三)按需部署 (四)灵活性高 (五…

左偏树学习笔记

定义 堆,是一棵树,且每个节点的键值都大于等于 / 小于其父亲的键值。 左偏树是一种可合并的堆,可以以 O ( log ⁡ n ) O(\log n) O(logn) 的复杂度实现合并。 性质 左偏树满足堆的性质。 我们设定一个值 dist \text{dist} dist&#xf…

动手学深度学习:1.线性回归从0开始实现

动手学深度学习:1.线性回归从0开始实现 1.手动构造数据集2.小批量读取数据集3.初始化模型参数4.定义模型和损失函数5.小批量随机梯度下降更新6.训练完整代码 1.手动构造数据集 根据带有噪声的线性模型构造一个人造数据集,任务是使用这个有限样本的数据集…

692. 前k个高频单词(map)

目录 一、题目 二、代码 一、题目 692. 前K个高频单词 - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution {class KV_sort{public:bool operator()(const pair<string,int> kv1, const pair<string,int> kv2){if(kv1.first kv2.first )//两个对…

C51--项目--感应开关盖垃圾桶

1、项目概述 功能描述&#xff1a; 检测靠近时&#xff0c;垃圾桶自动开盖并伴随滴一声&#xff0c;2s后关盖。 发生震动时&#xff0c;垃圾桶自动开盖并伴随滴一声&#xff0c;2s后关盖。 按下按键时&#xff0c;垃圾桶自动开盖并伴随滴一声&#xff0c;2s后关盖。 硬件说明…

Flutter笔记:发布一个模块 scale_design - (移动端)设计师尺寸适配工具

Flutter笔记 发布一个模块scale_design设计师尺寸适配工具与常用组件库 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/a…

UE5C++学习(一)--- 增强输入系统

一、关于增强输入系统的介绍 增强输入系统官方文档介绍 二、增强输入系统的具体使用 注&#xff1a;在使用方面&#xff0c;不会介绍如何创建项目等基础操作&#xff0c;如果还没有UE的使用基础&#xff0c;可以参考一下我之前UE4的文章&#xff0c;操作差别不会很大。 如上…

HIT_OS_LAB2 调试分析 Linux 0.00 多任务切换

操作系统实验二 2.1 实验目的 通过调试一个简单的多任务内核实例&#xff0c;使大家可以熟练的掌握调试系统内核的方法&#xff1b;掌握Bochs虚拟机的调试技巧&#xff1b;通过调试和记录&#xff0c;理解操作系统及应用程序在内存中是如何进行分配与管理的&#xff1b; 2.2…

配置OpenCV

Open CV中包含很多图像处理的算法&#xff0c;因此学会正确使用Open CV也是人脸识别研究的一项重要工作。在 VS2017中应用Open CV&#xff0c;需要进行手动配置&#xff0c;下面给出在VS2017中配置Open CV的详细步骤。 1.下载并安装OpenCV3.4.1与VS2017的软件。 2.配置Open CV环…

经典文献阅读之--DLIO(基于连续时间运动校正的轻量级激光雷达惯性导航系统)

0. 简介 一般来说&#xff0c;当系统经过不规则的地形时候&#xff0c;机器人自身会存在激烈运动会导致激光雷达扫描中的运动畸变&#xff0c;从而可能降低状态估计和建图的精度。虽然已经有一些方法用于缓解这种影响&#xff0c;但它们仍然过于简单或计算成本过高&#xff0c…

01-单节点部署clickhouse及简单使用

1、下载rpm安装包&#xff1a; 官网&#xff1a;https://packages.clickhouse.com/rpm/stable/ clickhouse19.4版本之后只需下载3个rpm安装包&#xff0c;上传到节点目录即可 2、rpm包安装&#xff1a; 安装顺序为conmon->server->client 执行 rpm -ivh ./clickhouse-…

美团面试:Redis 除了缓存还能做什么?可以做消息队列吗?

这是一道面试中常见的 Redis 基础面试题,主要考察求职者对于 Redis 应用场景的了解。 即使不准备面试也建议看看,实际开发中也能够用到。 内容概览: Redis 除了做缓存,还能做什么? 分布式锁:通过 Redis 来做分布式锁是一种比较常见的方式。通常情况下,我们都是基于 Re…

JMeter的使用——傻瓜式学习【下】

目录 前言 1、自动录制脚本 1.1、原理 1.2、JMeter脚本录制 2、JMeter直连数据库 2.1、直连数据库的作用 2.2、JMeter直连数据库的步骤 案例&#xff1a; 3、JMeter的逻辑控制器 3.1、if控制器 案例&#xff1a; 3.2、循环控制器 案例&#xff1a; 3.3、ForEach控…

22吉林大学软件需求分析与规范(Software Requirements Analysis Specification)

写在前面&#xff1a; 4w多字笔记&#xff0c;可能显示有问题&#xff0c;带图片完整pdf版暂定10r一份&#xff0c;需要的同学可以加wx:fanaobo&#xff0c;备注软件需求笔记。 chapter 0 课程简介 课程简介&#xff1a; ◼ 软件工程专业核心课程之一 ◼ 软件工程课程体系最…

大数据毕业设计选题推荐-热门旅游景点数据分析-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…