版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第C++多态的示例详解目录案例一:计算器案例要求代码实现运行效果案例二:制作饮品案例要求代码实现运行效果案例三:电脑组装案例要求代码实现运行效果今天就以三个案例来把C++多态的内容结束。第一个案例就是用多态写一个计算器并实现简单的加减乘除操作;第二个案例就是一个饮品制作,主要就是抽象类重写方法;第三个是比较综合的电脑组装案例,正文会详细介绍;那么就开始上手操作吧!
案例一:计算器
案例要求
使用多态实现计算器的加减乘除操作
代码实现
classAbstractCalculator
public:
//纯虚函数,用来得到计算结果
virtualvoidgetResult()=0;
floatnum1,num2;
//加法类
classAdd:publicAbstractCalculator
public:
voidgetResult()
coutnum1"+"num2"="num1+num2endl;
//减法类
classSub:publicAbstractCalculator
public:
voidgetResult()
coutnum1"-"num2"="num1-num2endl;
//乘法类
classMul:publicAbstractCalculator
public:
voidgetResult()
coutnum1"*"num2"="num1*num2endl;
//除法类
classDes:publicAbstractCalculator
public:
voidgetResult()
coutnum1"/"num2"="num1/num2endl;
voidmain()
//1、加法
AbstractCalculator*abc=newAdd();
abc-num1=2.1;
abc-num2=3.9;
abc-getResult();
deleteabc;
//2、减法
abc=newSub();
abc-num1=3.9;
abc-num2=2.1;
abc-getResult();
deleteabc;
//3、乘法
abc=newMul();
abc-num1=4.2;
abc-num2=2;
abc-getResult();
deleteabc;
//4、除法
abc=newDes();
abc-num1=8.8;
abc-num2=2;
abc-getResult();
deleteabc;
代码解释
首先创建AbstractCalculator类作为基类,设置两个浮点型属性用来做基本运算,并含有纯虚函数getResult。我们知道还有纯虚函数的类被称为抽象类,特点是无法实例化,非抽象子类必须重写抽象类的所有纯虚函数,因此基本运算的类都要重写getResult方法。接下来写了加减乘除四个派生类继承该抽象类,分别给派生类的getResult进行重写,得到不同的计算结果。主函数中利用父类指针来创建子类对象,给两个操作数赋值后调用getResult方法,然后利用delete删除指针。注意删除指针只是删除了那一块地址,该指针的类型是不变的,还可以多次利用,指向不同的子类对象。
运行效果
案例二:制作饮品
给出制作饮品的过程为四步:把水煮开、冲泡、倒入杯中、加入佐料。
利用多态写出两个饮品的制作过程
#includeiostream
usingnamespacestd;
//使用多态制作奶茶
classAbstractDrink
public:
//制作开水
virtualvoidboiledWater()=0;
//冲泡
virtualvoidbrew()=0;
//倒入杯中
virtualvoidinCup()=0;
//加入佐料
virtualvoidpour()=0;
voidmakeDrink()
this-boiledWater();
this-brew();
this-inCup();
this-pour();
//制作咖啡
classCoffee:publicAbstractDrink
public:
//煮水
virtualvoidboiledWater()
cout"先把水煮开"endl;
//冲泡
virtualvoidbrew()
cout"开始冲泡咖啡"endl;
//倒入杯中
virtualvoidinCup()
cout"全部倒入杯中"endl;
//加入辅料
virtualvoidpour()
cout"加入糖和牛奶"endl;
cout"牛奶咖啡制作完成"endl;
//制作茶水
classTea:publicAbstractDrink
public:
//煮水
virtualvoidboiledWater()
cout"先把水煮开"endl;
//冲泡
virtualvoidbrew()
cout"开始冲泡茶叶"endl;
//倒入杯中
virtualvoidinCup()
cout"全部倒入杯中"endl;
//加入辅料
virtualvoidpour()
cout"加入枸杞"endl;
cout"茶水制作完成"endl;
//制作函数
voidDoWork(AbstractDrink*abs)//父类指针指向子类对象AbstractDrinking*abs=newCoffee;
abs-makeDrink();
deleteabs;//手动释放
//堆区的数据被销毁了但是指针的类型没变,可以多次利用
voidtest()
DoWork(newCoffee);
cout"---------------------"endl;
DoWork(newTea);
voidmain()
test();
代码解释
这个案例就是直接给一个类中加四个纯虚函数,然后再加一个makeDrink方法来调用全部函数。子类中需要重写四个纯虚函数,制作咖啡和茶的类步骤基本一样。在DoWork函数的形参列表,使用父类的指针,那么在test函数调用DoWork函数就可以直接new子类对象,这样也是父类指针指向子类对象,然后调用makeDrink方法后,用delete删除堆区父类指针,以免内存泄漏。
案例三:电脑组装
电脑主要组成部件为CPU(用于计算),显卡(用于显示),内存条(用于存储)
将每个零件封装出抽象基类,并且提供不同的厂商生产不同的零件,例如Intel厂商和Lenovo厂商
创建电脑类提供让电脑工作的函数,并且调用每个零件工作的接口
测试时组装三台不同的电脑进行工作
classCPU
public:
virtualvoidcalculate()=0;
classVideoCard
public:
virtualvoiddisplay()=0;
classStorage
public:
virtualvoidstorage()=0;
classComputer
public:
Computer(CPU*cpu,VideoCard*vc,Storage*sto)
m_cpu=cpu;
m_vc=vc;
m_sto=sto;
//提供一个工作的函数
voidwork()
m_cpu-calculate();
m_vc-display();
m_sto-storage();
//提供析构函数释放3个电脑零件
~Computer()
//释放CPU零件
if(m_cpu!=NULL)
deletem_cpu;
m_cpu=NULL;
//释放显卡零件
if(m_vc!=NULL)
deletem_vc;
m_vc=NULL;
//释放内存条零件指针
if(m_sto!=NULL)
deletem_sto;
m_sto=NULL;
private:
CPU*m_cpu;//CPU零件指针
VideoCard*m_vc;//显卡零件指针
Storage*m_sto;//内存条零件指针
//Intel
classIntelCPU:publicCPU
public:
virtualvoidcalculate()
cout"Intel的CPU开始计算了"endl;
classIntelVideoCard:publicVideoCard
public:
virtualvoiddisplay()
cout"Intel的显卡开始显示了"endl;
classIntelMemory:publicStorage
public:
virtualvoidstorage()
cout"Intel的内存条开始存储了"endl;
//Lenovo
classLenovoCPU:publicCPU
public:
virtualvoidcalculate()
cout"Lenovo的CPU开始计算了"endl;
classLenovoVideoCard:publicVideoCard
public:
virtualvoiddisplay()
cout"Lenovo的显卡开始显示了"endl;
classLenovoMemory:publicStorage
public:
virtualvoidstorage()
cout"Lenovo的内存条开始存储了"endl;
//组装电脑
voidtest01()
//创建第一台电脑
Computer*c1=newComputer(newIntelCPU,newIntelVideoCard,newIntelMemory);
c1-work();
deletec1;
cout"***********************"endl;
//组装第二台电脑
Computer*c2=newComputer(newLenovoCPU,newLenovoVideoCard,newLenovoMemory);
c2-work();
deletec2;
cout"***********************"endl;
//组装第三台电脑
Computer*c3=newComputer(newLenovoCPU,newIntelVideoCard,newLenovoMemory);
c3-work();
deletec3;
voidmain()
test01();
system("pause");
代码解释
首先把CPU,显卡,内存条做成基类并各自添加纯虚函数,强制派生类进行重写。
然后创建Computer类,封装三个零件类的指针,在电脑类的有参构造中传入三个零件的指针并赋值,提供work函数调用各个零件的功能函数。在程序结束之前编译器会自动调用析构,所以我提供一个电脑类的析构函数,释放掉三个零件的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- PHP函数面试题及详细答案(实战版)
- 2026年全国高校辅导员素质能力大赛笔试测试卷及参考答案
- PETS三级考试完整题型说明、真题模拟及详细答案解析
- 地铁车站导向标识更新方案
- 2026全国演出经济人考试题目及答案(演出市场政策与经济实务)
- 平衡康复训练跌倒风险动态防控方案共识
- 2026学年吉林省磐石市四年级语文期末自我评估难点突破题(附答案)详细答案和解析
- Oracle数据库高频面试题及详细答案(实战版)
- OC运维工程师笔试真题及详细答案(真实企业版)
- 护士岗位职责培训考试题及答案
- 英语二必考500词
- 工程地质及水文地质课件
- 初三差生班会课件
- DB31/T 1236-2020未成年人司法社会工作服务规范
- C++解析wav文件方法介绍
- 酶解法从虾壳中提取甲壳素技术
- 第47 届世界技能大赛商品展示技术项目技术文件
- 04S519小型排水构筑物(含隔油池)图集
- 饲料生产许可证考试(判断题200题)附有答案
- 小学语文作文:五感法描写课件
- 海龟编辑器画图
评论
0/150
提交评论