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

对象切片和解决方案

1、对象切片是指当把一个派生类对象赋值给基类对象时,派生类中特有的部分被“切掉”,只保留基类部分的现象。

2、值传递会导致切片现象,如下,永远输出 Base

void func(Base obj) { // 值传递 obj.show(); // 永远输出 "Base" } Derived d; func(d); // d 被切片,derivedData 丢失

3、容器存储基类对象,导致切片现象,如下,永远存储Base的部分。

vector<Base> vec; Derived d; vec.push_back(d); // 切片发生,只能存储 Base 部分

4、如何避免对象切片的发生,方案一:使用指针或引用;

void func(Base& obj) { // 引用传递 obj.show(); // 输出 "Derived"(多态有效) } void func(Base* obj) { // 指针传递 obj->show(); // 输出 "Derived" }

方案二:使用智能指针。

vector<shared_ptr<Base>> vec; vec.push_back(make_shared<Derived>()); // 安全,无切片

5、使用陷阱,如下图使用工厂创建返回Shape类型,就会造成对象切片。

enum EShape { eShapeCircle = 0, eShapeTriangle, eShapeRectangle }; class Shape{...}; class Circle:public Shape{...}; class Triangle:public Shape{...}; class Rectangle:public Shape{...}; Shape creatShape(EShape) { case eShapeCircle: return Circle(); case eShapeTriangle: return Triangle(); case eShapeRectangle: return Rectangle(); }

6、解决上述问题的办法就是返回指针或引用,但这样会造成内存泄漏

enum EShape { eShapeCircle = 0, eShapeTriangle, eShapeRectangle }; class Shape{...}; class Circle:public Shape{...}; class Triangle:public Shape{...}; class Rectangle:public Shape{...}; Shape* creatShape(EShape) { case eShapeCircle: return new Circle(); case eShapeTriangle: return new Triangle(); case eShapeRectangle: return new Rectangle(); }

7、上述是由于返回值创建了堆对象,造成了内存泄漏,解决方案:利用RAII规则,创建一个本地对象,在本地对象的析构函数里释放内存,利用本地对象生命周期来管理创建堆对象的生命周期,上述代码可以优化为:

enum EShape { eShapeCircle = 0, eShapeTriangle, eShapeRectangle }; class Shape_wrapper { public: Shape_wrapper(Shape* shape = nullptr):m_shape(shape){} ~Shape_wrapper(){ delete m_shape;} Shape* get()const { return m_shape;} virtual show(){} public: Shape* m_shape = nullptr; }; void foo() { //在函数中创建对象,对象销毁时,自动调用析构函数 shape_wrapper shapeWrapper(createShape(...)); }
http://www.jsqmd.com/news/718984/

相关文章:

  • 闲置百联 OK 卡别放着了,这样处理更省心 - 团团收购物卡回收
  • 2026年西藏装配式建筑深度横评:拉萨集成房屋与高原绿色建材完全选购指南 - 优质企业观察收录
  • DDrawCompat完整指南:在Windows 11上轻松修复经典老游戏兼容性问题
  • 2026年淄博处理合伙纠纷律师怎么选,朋友合伙开店股权分配策略分享 - 工业品牌热点
  • 从苹果到柯达:盘点那些藏在手机相机里的经典色度降噪(CNR/UVNR)专利
  • LayUI表单提交时,如何优雅地获取并处理级联选择器(省市区)的选中值?
  • 拆解博世、大陆的EMB方案:自增力机构如何省下83%的能耗?
  • 别再只ping了!用Nmap这5个隐藏技巧,快速摸清内网主机存活状态
  • Go语言的runtime.GOMAXPROCS
  • 5分钟掌握layerdivider:AI图像分层工具让设计效率提升10倍
  • 聊聊2026年床垫源头厂家选哪家好,床垫个性化定制需求如何满足 - 工业品牌热点
  • 陕西水泥/树脂/不锈钢/铸铁井盖+雨水篦子厂家推荐选型指南 - 深度智识库
  • STM32项目踩坑记:从PCA9535换到PCA9555,我解决了哪些中断和I2C读取的坑?
  • 探讨2026年淄博口碑好的公司商事律师品牌机构,该如何选择 - 工业品牌热点
  • 凌晨2点,我的Agent把代码改崩了:从单点失控到专业团队协作的工程化思维
  • 从一次应急响应看大华ICC文件读取漏洞:攻击者视角下的信息收集与防御加固建议
  • 别再手动重定向printf了!STM32CubeMX+FreeRTOS下串口调试的保姆级配置(基于正点原子F429)
  • PySpark数据处理:精准去重与排序
  • 国内主流油温机品牌实测盘点:性能与服务对比 - 奔跑123
  • Ohook:重构Office验证生态的架构哲学与实践范式
  • 终极NVS别名系统详解:简化Node.js版本管理的5个实用技巧
  • 免费开源在线PPT制作工具PPTist:5分钟创建专业演示文稿的完整指南
  • 别再只盯着main函数了!深入STM32启动文件,理解堆栈分配与内存布局的实战指南
  • Spring Boot配置文件加密实战:用Jasypt 3.0.5保护你的数据库密码(附完整配置流程)
  • Mac Mouse Fix终极指南:7大功能让普通鼠标在macOS上超越苹果触控板
  • 格式改到崩溃?Paperxie 一键对齐 4000 + 高校标准,告别导师 “打回式” 修改
  • 五一节前清空抽屉,闲置天猫超市卡别浪费,正规回收看这里 - 喵权益卡劵助手
  • 模拟消息队列的消费逻辑-Java
  • t-digest在Redis中的应用:高性能概率数据结构实战
  • Cursor破解工具完全指南:永久免费使用AI编程助手