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

C++工程实战入门笔记13-多态

成员函数重写(非多态)

#include<iostream>
using namespace std;
#include<string>class Widget
{
public:void Move(int x, int y) { x_ = x; y_ = y; }void Draw() { cout << "Widget Draw:" << x_ << ":"<< y_ << endl; }int x() { return x_; }int y() { return y_; }
private:int x_{ 0 };int y_{ 0 };
};//画矩形,继承Draw
class Rect :public Widget
{
public:void Draw() { cout << "Rect Draw:" << x() << ":" << y() << endl; }
};//画圆,继承Draw
class Circle :public Widget
{
public:void Draw() { cout << "Circle Draw:" << x() << ":" << y() << endl; }
};int main()
{Widget w;// 创建基类对象w.Draw(); // 调用基类的DrawRect re;// 创建派生类对象re.Move(100,100);// 调用继承自基类的方法re.Draw();// 调用派生类自己的DrawCircle ci;// 创建另一个派生类对象ci.Draw();// 调用派生类自己的Drawsystem("pause");}

在这里插入图片描述

多态

加入两个函数

void DrawWidget(Widget* w)
{w->Draw();
}void DrawWidget(Widget& w)
{w.Draw();
}

main函数中加入

	cout << "------------------------" << endl;DrawWidget(re);DrawWidget(&ci);DrawWidget(w);

在这里插入图片描述
出问题了,全部都调用的Widget的pubulic下的Draw函数,没按照预期输出,此时需要加入虚函数。
把class Widget的public下的

void Draw() { cout << "Widget Draw:" << x_ << ":"<< y_ << endl; }

改成

virtual void Draw() { cout << "Widget Draw:" << x_ << ":"<< y_ << endl; }

添加override

//画矩形,继承Draw
class Rect :public Widget
{
public:void Draw() override { cout << "Rect Draw:" << x() << ":" << y() << endl; }
};//画圆,继承Draw
class Circle :public Widget
{
public:void Draw() override { cout << "Circle Draw:" << x() << ":" << y() << endl; }
};

再次运行代码
在这里插入图片描述
这次就对了

多态性的优势

实际工程中应用举例

class Scene
{
public:void Add(Widget* w){wids_.push_back(w);}void DrawAll(){for (auto w : wids_)w->Draw();}~Scene()//防止内存泄露{for (auto w : wids_)delete w;wids_.clear();}
private:vector<Widget*>wids_;
};
  • Scene类包含一组Widget对象,可以统一管理它们;
  • 使用vector<Widget*>存储指向各种图形对象的指针;
  • 通过遍历集合,对所有对象执行相同操作(如绘制);
  • 可以轻松添加新的图形类型,无需修改Scene类,具有可扩展性

main函数中加入

int main()
{Scene sec;sec.Add(new Widget());sec.Add(new Circle());sec.Add(new Rect());sec.DrawAll();
}

这段代码展示了C++多态性的强大功能,特别是通过Scene类实现了:

多态容器管理多种类型的图形对象
统一接口处理不同类型的对象
易于扩展和维护的代码结构

Scene类的设计体现了面向对象设计的重要原则:

开闭原则(对扩展开放,对修改关闭)
依赖倒置原则(依赖抽象而非具体实现)
单一职责原则(每个类负责一个明确的功能)
这种设计模式是构建大型、可维护C++应用程序的基础。


文章转载自:

http://Vp9UsizP.mhnrx.cn
http://Nme5cMmR.mhnrx.cn
http://LuRSkhkU.mhnrx.cn
http://ju4rxCnJ.mhnrx.cn
http://9x1NvgKq.mhnrx.cn
http://tGxE4piJ.mhnrx.cn
http://SI8fm0ND.mhnrx.cn
http://uOMVnWPT.mhnrx.cn
http://RWZvpdq3.mhnrx.cn
http://22Ivdg46.mhnrx.cn
http://iUWuferR.mhnrx.cn
http://q3uXJ53u.mhnrx.cn
http://7KIoiRrY.mhnrx.cn
http://T4N0zZJm.mhnrx.cn
http://IL5taqwZ.mhnrx.cn
http://airSiSci.mhnrx.cn
http://xaB1FT3n.mhnrx.cn
http://41kD9vNz.mhnrx.cn
http://ktfRqzVG.mhnrx.cn
http://leBGFsdB.mhnrx.cn
http://XH1cVmCE.mhnrx.cn
http://BjT7zUa1.mhnrx.cn
http://33XgI3x8.mhnrx.cn
http://AaqCpMbD.mhnrx.cn
http://8rCqFokI.mhnrx.cn
http://CUdQ6dAr.mhnrx.cn
http://iqnnfupW.mhnrx.cn
http://dezNEH6e.mhnrx.cn
http://3jTDK3MR.mhnrx.cn
http://B7oLFN1b.mhnrx.cn
http://www.dtcms.com/a/373912.html

相关文章:

  • Python元组:不可变但灵活的数据容器
  • 设计模式(策略,观察者,单例,工厂方法)
  • C++智能指针(先行版)
  • 安卓蓝牙文件传输完整指南
  • C++读文件(大学考试难度)
  • 拆解LinuxI2C驱动之mpu6050
  • Linux--线程
  • 中大型水闸安全监测的关键环节与措施
  • 基于QMkae/CMake配置QT生成的exe图标
  • 安科瑞电动机保护器:赋能化工冶炼行业高效安全生产的智能守护
  • 数据结构之链表(单向链表与双向链表)
  • 学习嵌入式的第三十五天——数据库
  • Coze源码分析-资源库-删除插件-后端源码-错误处理与总结
  • 中级统计师-统计法规-第一章 基本统计法律规范
  • 从日志到防火墙——一次“SQL注入”排查笔记
  • Java全栈开发面试实战:从基础到微服务架构
  • 《小小进阶:小型企业网规划组网与实现》
  • 深度学习——调整学习率
  • MySQL问题7
  • Sealminer A2 224T矿机评测:SHA-256算法,适用于BTC/BCH
  • windows下安装claude code+国产大模型glm4.5接入(无需科学上网)
  • C语言与FPGA(verilog)开发流程对比
  • 5G/6G时代的智能超表面:如何重构无线传播环境?
  • 【3D图像算法技术】如何对3DGS数据进行编辑?
  • Node.js对接即梦AI实现“千军万马”视频
  • Spring Boot Banner
  • 安卓端部署Yolov5目标检测项目全流程
  • 《2025年AI产业发展十大趋势报告》四十六
  • 《普通逻辑》学习记录——普通逻辑的基本规律
  • 彻底禁用 CentOS 7.9 中 vi/vim 的滴滴声