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

《Effective C++》条款27

尽量少做转型动作

class A
{
public:A(int x) :a(x) {};virtual void add(){a++;}
private:int a;
};
class B :public A
{
public:B(int x) :b(x),A(x) {};virtual void add(){static_cast<A>(*this).add();b++;}private:int b;
};

如上描述把子类转型为A类,调用了A::add()。但是它调用的不是当前对象上的函数,而是稍早转型动作所建立的一个"*this对象之base class成分"的暂时副本上的add 。(成员函数只有一份,关键在于成员函数都有一个this指针,会因此影响成员函数操作的数据。)如果add修改了当前对象的内容,当前对象其实没有被改动,被改动的是副本。然而B类里面的add如果也修改对象,那么该对象会被改变。这使当前对象进入一种“伤残”状态:其base class成分的更改没有落实,而derived class成分的更改倒是落实了。

所以请这么写:

class B :public A
{
public:B(int x) :b(x),A(x) {};virtual void add(){A::add();b++;}private:int b;
};

如果想使用dynamic_cast,通常是你想在一个你认定为子类对象身上执行子类操作函数但是你手上只有一个指向基类的指针或引用。你只能靠它们来处理对象。有两个做法可以避免这个问题:

假设子类有一个唯一的函数func

class B :public A
{
public:...void func();...
};

你可以使用容器并在其中存储直接指向子类对象的指针:

typedef vector<shared_ptr<B>> Bptr;
Bptr bp;
...
for (Bptr::iterator iter = bp.begin();iter != bp.end();++iter)
{(*iter)->func();
}

而另一种做法可以让你通过基类接口处理“所有可能之各种A派生类”,那就是在基类内提供virtual函数做到你想对任何派生类做的事:

class A
{
public:virtual void func(){// 什么也不做,缺省}...
};
class B :public A
{
public:virtual void func(){...}...
};
int main()
{typedef vector<shared_ptr<A>> Aptr;Aptr ap;...for (Aptr::iterator iter = ap.begin();iter != ap.end();++iter){(*iter)->func();}
}

这两种做法都可以替代dynamic_cast。

 

相关文章:

《Effective C++》条款27

尽量少做转型动作 class A { public:A(int x) :a(x) {};virtual void add(){a;} private:int a; }; class B :public A { public:B(int x) :b(x),A(x) {};virtual void add(){static_cast<A>(*this).add();b;}private:int b; }; 如上描述把子类转型为A类&#xff0c;调用…...

无图谱不AI之三元组数据保存Neo4j

目录 1. 代码学习1.1 源代码1.2 代码解读 没有图谱称为弱人工智能&#xff0c;有图谱的称为强人工智能。 图谱可以让机器学习和人工智能具备推理能力。 1. 代码学习 1.1 源代码 # -*- coding: utf-8 -*- from py2neo import Node, Graph, Relationship# 可以先阅读下文档&a…...

Mybatisplus同时向两张表里插入数据[事务的一致性]

一、需求&#xff1a;把靶器官的数据&#xff0c;单独拿出来作为一个从表&#xff0c;以List的方式接收这段数据&#xff1b; 此时分析&#xff0c;是需要有两个实体的&#xff0c;一个是主表的实体&#xff0c;一个是从表的实体&#xff0c;并在主表实体新增一个List 字段来接…...

天眼销:精准的企业名录

企业名录的重要性&#xff0c;对于销售而言都是极其重要的。本期为家人们分享如何正确挑选出优质的企业名录渠道&#xff0c;避免走一些弯弯坑坑。 为了有效利用企业名录进行客户开发&#xff0c;您需要关注信息的准确性、可提供的资源数量以及信息的时效性。能否根据您的需求…...

TypeError: Cannot read properties of null (reading ‘shapeFlag‘)

vue3 开发过程遇到这样一个报错 TypeError: Cannot read properties of null (reading shapeFlag)最后发现是ref定义的变量&#xff0c;在访问时没有使用.valuereactive 变量初始化是数组&#xff0c;如果使用字符串赋值时也会报这个错。...

视频监控平台EasyCVR多场景应用,AI视频分析技术助力行业升级转型

传统的视频监控系统建设&#xff0c;经常存在各方面的因素制约&#xff0c;造成管理机制不健全、统筹规划不到位、联网共享不规范&#xff0c;形成“信息孤岛”、“数据烟囱”。在监控系统的建设中缺乏统一规划&#xff0c;标准不统一、视频图像信息利用率低等问题日益突出。随…...

如何搭建外网可访问的Serv-U FTP服务器,轻松远程共享文件!

目录 1. 前言 2. 本地FTP搭建 2.1 Serv-U下载和安装 2.2 Serv-U共享网页测试 2.3 Cpolar下载和安装 3. 本地FTP发布 3.1 Cpolar云端设置 3.2 Cpolar本地设置 4. 公网访问测试 5. 总结 1. 前言 科技日益发展的今天&#xff0c;移动电子设备似乎成了我们生活的主角&am…...

c++--类型的基础

1.常量对象&#xff0c;常量成员函数 (1).常量对象 常量对象的引用和指针不能调用类的普通的成员函数。只能调用常量成员函数。 (2).常量成员函数&#xff1a;把const放在类成员函数参数列表后。表示隐含的this是一个指向常量的指针 (3).当创建一个const对象时&#xff0c;直到…...

Python with提前退出:坑与解决方案

Python with提前退出&#xff1a;坑与解决方案 问题的起源 早些时候使用with实现了一版全局进程锁&#xff0c;希望实现以下效果&#xff1a; Python with提前退出&#xff1a;坑与解决方案 全局进程锁本身不用多说&#xff0c;大部分都依靠外部的缓存来实现的&#xff0c;r…...

Vue3-provide和inject

作用和场景&#xff1a;顶层组件向任意的底层组件传递数据和方法&#xff0c;实现跨层组件通信 跨层传递普通数据&#xff1a; 1.顶层组件通过provide函数提供数据 2.底层组件通过inject函数获取数据 既可以传递普通数据&#xff0c;也可以使用ref传递响应式数据&#xff08…...

Python与设计模式--适配器模式

23种计模式之 前言 &#xff08;5&#xff09;单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、&#xff08;11&#xff09;策略模式、责任链模式、命令模式、中介者模…...

大模型能否生成搜索引擎的未来?

文&#xff5c;郝 鑫 编&#xff5c;刘雨琦 ChatGPT火爆之前&#xff0c;水面下&#xff0c;也有中国公司也在朝着智能助手的方向努力。夸克便是其中之一。在GPT风靡科技圈后&#xff0c;国内就开始陆续冒出一些大模型厂商。对当时夸克而言&#xff0c;做大模型毋庸置疑&am…...

鸿蒙开发-ArkTS 语言-状态管理

[写在前面: 文章多处用到gif动图&#xff0c;如未自动播放&#xff0c;请点击图片] 衔接上一篇:鸿蒙开发-ArkTS 语言-基础语法 3. 状态管理 变量必须被装饰器装饰才能成为状态变量&#xff0c;状态变量的改变才能导致 UI 界面重新渲染 概念描述状态变量被状态装饰器装饰的变…...

一篇文章带你掌握MongoDB

文章目录 1. 前言2. MongoDB简介3. MongoDB与关系型数据库的对比4. MongoDB的安装5. Compass的使用6. MongoDB的常用语句7. 总结 1. 前言 本文旨在帮助大家快速了解MongoDB,快速了解和掌握MongoDB的干货内容. 2. MongoDB简介 MongoDB是一种NoSQL数据库&#xff0c;采用了文档…...

删除docker镜像

随着我们拉取的镜像越来越多&#xff0c;镜像的管理越来越难。这时候可能就需要删除镜像了。 本关的任务是学习如何删除容器&#xff0c;要求学习者参照示例&#xff0c;将busybox:latest镜像删除。 相关知识 删除镜像 如果要删除本地的镜像&#xff0c;可以使用 docker rm…...

力扣 --- 删除有序数组中的重复项 II

题目描述&#xff1a; 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的…...

Opencv图像处理(全)

文章目录 博主精品专栏导航备注&#xff1a;以下源码均可运行&#xff0c;不同项目涉及的函数均有详细分析说明。11、图像项目实战&#xff08;一&#xff09;银行卡号识别 —— sort_contours()、resize()&#xff08;二&#xff09;文档扫描OCR识别 —— cv2.getPerspectiveT…...

Flutter桌面应用开发之毛玻璃效果

目录 效果实现方案依赖库支持平台实现步骤注意事项话题扩展 毛玻璃效果&#xff1a;毛玻璃效果是一种模糊化的视觉效果&#xff0c;常用于图像处理和界面设计中。它可以通过在图像或界面元素上应用高斯模糊来实现。使用毛玻璃效果可以增加图像或界面元素的柔和感&#xff0c;同…...

基于C#实现优先队列

一、堆结构 1.1性质 堆是一种很松散的序结构树&#xff0c;只保存了父节点和孩子节点的大小关系&#xff0c;并不规定左右孩子的大小&#xff0c;不像排序树那样严格&#xff0c;又因为堆是一种完全二叉树&#xff0c;设节点为 i,则 i/2 是 i 的父节点&#xff0c;2i 是 i 的…...

ssm+vue的仓库在线管理系统的设计与实现(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的仓库在线管理系统的设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三…...

别再为单细胞数据批次效应发愁了!手把手教你用Harmony算法搞定整合分析(附Seurat实战代码)

单细胞数据整合实战&#xff1a;用Harmony算法高效消除批次效应当我们面对来自不同实验室、不同测序平台或不同实验条件的单细胞RNA测序数据时&#xff0c;一个无法回避的挑战就是批次效应。这种技术性变异会掩盖真实的生物学差异&#xff0c;导致细胞聚类混乱、跨样本比较失效…...

信用评分中的算法公平性:从理论到实践的全面解析

1. 项目概述&#xff1a;当信用评分遇上算法公平性在金融科技领域&#xff0c;信用评分模型早已不是新鲜事物。从传统的逻辑回归到如今复杂的梯度提升树和神经网络&#xff0c;机器学习模型凭借其强大的预测能力&#xff0c;已经成为银行和金融机构进行信贷决策、管理风险的核心…...

OpenRA中稳定获取应用程序目录的C#实践

1. 这不是“获取当前路径”那么简单&#xff1a;OpenRA里目录逻辑的特殊性很多人第一次在OpenRA项目里写C#代码时&#xff0c;会下意识地用Directory.GetCurrentDirectory()或者AppDomain.CurrentDomain.BaseDirectory去拿“程序所在文件夹”&#xff0c;结果发现——要么返回的…...

3D层析SAR与AutoML融合:实现高精度森林树种自动识别

1. 项目概述&#xff1a;当3D雷达“透视”森林&#xff0c;机器学习如何识别每一棵树&#xff1f;在森林资源管理与生态研究中&#xff0c;准确识别树种一直是个既基础又棘手的难题。传统的野外调查方法&#xff0c;依赖人力跋山涉水&#xff0c;不仅成本高昂、效率低下&#x…...

量子机器学习数据集构建:从核心要素到工程实践

1. 量子机器学习数据集构建&#xff1a;从分类到实践的核心思路量子机器学习&#xff08;QML&#xff09;这个领域&#xff0c;现在就像十年前的深度学习&#xff0c;概念很热&#xff0c;但真正能上手、能复现、能出成果的“基础设施”还非常稀缺。我接触过不少从经典机器学习…...

经典通信赋能分布式量子机器学习:NISQ时代的实用化路径探索

1. 项目概述&#xff1a;当量子机器学习遇上分布式架构量子机器学习&#xff08;QML&#xff09;这几年火得不行&#xff0c;它背后的逻辑其实挺吸引人的&#xff1a;利用量子态的叠加和纠缠特性&#xff0c;把数据映射到指数级庞大的希尔伯特空间里进行处理。理论上&#xff0…...

Android加固反调试绕过:Frida动态劫持pthread_create实战

1. 这不是“破解”&#xff0c;而是理解Android加固对抗中的一次典型动态插桩实践你打开B站App&#xff0c;刚点开首页&#xff0c;进程就闪退了&#xff1b;或者在Frida脚本里下断点到pthread_create&#xff0c;App直接静默终止——这不是崩溃日志里常见的NullPointerExcepti…...

8051单片机PDATA与XDATA存储访问优化解析

1. PDATA与XDATA变量生成的指令解析在8051单片机开发中&#xff0c;外部数据存储器的访问方式直接影响程序效率和硬件设计。作为从业十余年的嵌入式工程师&#xff0c;我经常需要针对不同存储区域优化代码。PDATA和XDATA作为两种常见的外部数据存储模式&#xff0c;其指令生成机…...

AI翻译准确率99.9%,专业翻译岗位反而增加了——这说明了什么

有一组数据很有意思&#xff1a;AI翻译的准确率已经能到99.9%&#xff0c;速度快&#xff0c;成本低&#xff0c;理论上完全具备替代人工翻译的能力。但实际情况是&#xff0c;专业翻译岗位的需求这几年不降反升。这背后的逻辑&#xff0c;对理解芯片工程师的核心价值也很有启发…...

Midjourney火焰生成实战手册(含17组已验证火纹Prompt+SDXL对比基准数据)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Midjourney火焰生成的核心原理与技术边界 Midjourney 并不原生支持“火焰生成”这一独立功能&#xff0c;其图像合成能力完全依赖于文本提示&#xff08;prompt&#xff09;对扩散模型隐空间的引导。所谓“火…...