当前位置: 首页 > 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。

 

http://www.lryc.cn/news/249258.html

相关文章:

  • 无图谱不AI之三元组数据保存Neo4j
  • Mybatisplus同时向两张表里插入数据[事务的一致性]
  • 天眼销:精准的企业名录
  • TypeError: Cannot read properties of null (reading ‘shapeFlag‘)
  • 视频监控平台EasyCVR多场景应用,AI视频分析技术助力行业升级转型
  • 如何搭建外网可访问的Serv-U FTP服务器,轻松远程共享文件!
  • c++--类型的基础
  • Python with提前退出:坑与解决方案
  • Vue3-provide和inject
  • Python与设计模式--适配器模式
  • 大模型能否生成搜索引擎的未来?
  • 鸿蒙开发-ArkTS 语言-状态管理
  • 一篇文章带你掌握MongoDB
  • 删除docker镜像
  • 力扣 --- 删除有序数组中的重复项 II
  • Opencv图像处理(全)
  • Flutter桌面应用开发之毛玻璃效果
  • 基于C#实现优先队列
  • ssm+vue的仓库在线管理系统的设计与实现(有报告)。Javaee项目,ssm vue前后端分离项目。
  • 什么是木马
  • Pinia仓库统一管理
  • [论文阅读]VoxSet——Voxel Set Transformer
  • 【开源】基于Vue.js的医院门诊预约挂号系统的设计和实现
  • 1、Mysql架构与历史
  • 考试复习
  • 使用Docker一键安装MySQL与Nginx脚本
  • VMware系列:Vmware vSphere常见问题及解决办法
  • 基于web宠颐生宠物医院系统设计与实现
  • 二、Gitee使用方法
  • 【C++】string模拟