历尽岁月沧桑,也愿你始终相信人间值得

✨写在前面
书接上文,今天就以三个案例来把C++多态的内容结束。第一个案例就是用多态写一个计算器并实现简单的加减乘除操作;第二个案例就是一个饮品制作,主要就是抽象类重写方法;第三个是比较综合的电脑组装案例,正文会详细介绍;那么就开始上手操作吧!
✨✨ 感兴趣的同学可以订阅一下我的这个《C++入门》专栏喔~✨✨
✨目录
使用多态实现计算器的加减乘除操作
- class AbstractCalculator
- {
- public:
- //纯虚函数,用来得到计算结果
- virtual void getResult() = 0;
- float num1, num2;
- };
- //加法类
- class Add :public AbstractCalculator
- {
- public:
- void getResult()
- {
- cout << num1 << "+" << num2 << "=" << num1 + num2 << endl;
- }
- };
- //减法类
- class Sub :public AbstractCalculator
- {
- public:
- void getResult()
- {
- cout << num1 << "-" << num2 << "=" << num1 - num2 << endl;
- }
- };
- //乘法类
- class Mul :public AbstractCalculator
- {
- public:
- void getResult()
- {
- cout << num1 << "*" << num2 << "=" << num1 * num2 << endl;
- }
- };
- //除法类
- class Des :public AbstractCalculator
- {
- public:
- void getResult()
- {
- cout << num1 << "/" << num2 << "=" << num1 / num2 << endl;
- }
- };
- void main()
- {
- //1、加法
- AbstractCalculator *abc = new Add();
- abc->num1 = 2.1;
- abc->num2 = 3.9;
- abc->getResult();
- delete abc;
- //2、减法
- abc = new Sub();
- abc->num1 = 3.9;
- abc->num2 = 2.1;
- abc->getResult();
- delete abc;
- //3、乘法
- abc = new Mul();
- abc->num1 = 4.2;
- abc->num2 = 2;
- abc->getResult();
- delete abc;
- //4、除法
- abc = new Des();
- abc->num1 = 8.8;
- abc->num2 = 2;
- abc->getResult();
- delete abc;
- }
首先创建AbstractCalculator类作为基类,设置两个浮点型属性用来做基本运算,并含有纯虚函数getResult。我们知道还有纯虚函数的类被称为抽象类,特点是无法实例化,非抽象子类必须重写抽象类的所有纯虚函数,因此基本运算的类都要重写getResult方法。接下来写了加减乘除四个派生类继承该抽象类,分别给派生类的getResult进行重写,得到不同的计算结果。主函数中利用父类指针来创建子类对象,给两个操作数赋值后调用getResult方法,然后利用delete删除指针。注意删除指针只是删除了那一块地址,该指针的类型是不变的,还可以多次利用,指向不同的子类对象。

给出制作饮品的过程为四步:把水煮开、冲泡、倒入杯中、加入佐料。
利用多态写出两个饮品的制作过程
- #include<iostream>
- using namespace std;
- //使用多态制作奶茶
- class AbstractDrink
- {
- public:
- //制作开水
- virtual void boiledWater() = 0;
- //冲泡
- virtual void brew() = 0;
- //倒入杯中
- virtual void inCup() = 0;
- //加入佐料
- virtual void pour() = 0;
- void makeDrink()
- {
- this->boiledWater();
- this->brew();
- this->inCup();
- this->pour();
- }
- };
- //制作咖啡
- class Coffee :public AbstractDrink
- {
- public:
- //煮水
- virtual void boiledWater()
- {
- cout << "先把水煮开" << endl;
- }
- //冲泡
- virtual void brew()
- {
- cout << "开始冲泡咖啡" << endl;
- }
- //倒入杯中
- virtual void inCup()
- {
- cout << "全部倒入杯中" << endl;
- }
- //加入辅料
- virtual void pour()
- {
- cout << "加入糖和牛奶" << endl;
- cout << "牛奶咖啡制作完成" << endl;
- }
- };
- //制作茶水
- class Tea :public AbstractDrink
- {
- public:
- //煮水
- virtual void boiledWater()
- {
- cout << "先把水煮开" << endl;
- }
- //冲泡
- virtual void brew()
- {
- cout << "开始冲泡茶叶" << endl;
- }
- //倒入杯中
- virtual void inCup()
- {
- cout << "全部倒入杯中" << endl;
- }
- //加入辅料
- virtual void pour()
- {
- cout << "加入枸杞" << endl;
- cout << "茶水制作完成" << endl;
- }
- };
- //制作函数
- void DoWork(AbstractDrink* abs)//父类指针指向子类对象AbstractDrinking* abs = new Coffee;
- {
- abs->makeDrink();
- delete abs;//手动释放
- //堆区的数据被销毁了但是指针的类型没变,可以多次利用
- }
- void test()
- {
- DoWork(new Coffee);
- cout << "---------------------" << endl;
- DoWork(new Tea);
- }
- void main()
- {
- test();
- }
这个案例就是直接给一个类中加四个纯虚函数,然后再加一个makeDrink方法来调用全部函数。子类中需要重写四个纯虚函数,制作咖啡和茶的类步骤基本一样。在DoWork函数的形参列表,使用父类的指针,那么在test函数调用DoWork函数就可以直接new子类对象,这样也是父类指针指向子类对象,然后调用makeDrink方法后,用delete删除堆区父类指针,以免内存泄漏。

电脑主要组成部件为 CPU(用于计算),显卡(用于显示),内存条(用于存储)
将每个零件封装出抽象基类,并且提供不同的厂商生产不同的零件,例如Intel厂商和Lenovo厂商
创建电脑类提供让电脑工作的函数,并且调用每个零件工作的接口
测试时组装三台不同的电脑进行工作
- class CPU
- {
- public:
- virtual void calculate() = 0;
- };
- class VideoCard
- {
- public:
- virtual void display() = 0;
- };
- class Storage
- {
- public:
- virtual void storage() = 0;
- };
- class Computer
- {
- public:
- Computer(CPU* cpu, VideoCard* vc, Storage* sto)
- {
- m_cpu = cpu;
- m_vc = vc;
- m_sto = sto;
- }
- //提供一个工作的函数
- void work()
- {
- m_cpu->calculate();
- m_vc->display();
- m_sto->storage();
- }
- //提供析构函数释放3个电脑零件
- ~Computer()
- {
- //释放CPU零件
- if (m_cpu != NULL)
- {
- delete m_cpu;
- m_cpu = NULL;
- }
- //释放显卡零件
- if (m_vc != NULL)
- {
- delete m_vc;
- m_vc = NULL;
- }
- //释放内存条零件指针
- if (m_sto != NULL)
- {
- delete m_sto;
- m_sto = NULL;
- }
- }
- private:
- CPU* m_cpu;//CPU零件指针
- VideoCard* m_vc;//显卡零件指针
- Storage* m_sto;//内存条零件指针
- };
- //Intel
- class IntelCPU :public CPU
- {
- public:
- virtual void calculate()
- {
- cout << "Intel的CPU开始计算了" << endl;
- }
- };
- class IntelVideoCard :public VideoCard
- {
- public:
- virtual void display()
- {
- cout << "Intel的显卡开始显示了" << endl;
- }
- };
- class IntelMemory :public Storage
- {
- public:
- virtual void storage()
- {
- cout << "Intel的内存条开始存储了" << endl;
- }
- };
- //Lenovo
- class LenovoCPU :public CPU
- {
- public:
- virtual void calculate()
- {
- cout << "Lenovo的CPU开始计算了" << endl;
- }
- };
- class LenovoVideoCard :public VideoCard
- {
- public:
- virtual void display()
- {
- cout << "Lenovo的显卡开始显示了" << endl;
- }
- };
- class LenovoMemory :public Storage
- {
- public:
- virtual void storage()
- {
- cout << "Lenovo的内存条开始存储了" << endl;
- }
- };
- //组装电脑
- void test01()
- {
- //创建第一台电脑
- Computer* c1 = new Computer(new IntelCPU,new IntelVideoCard, new IntelMemory);
- c1->work();
- delete c1;
- cout << "***********************" << endl;
- //组装第二台电脑
- Computer* c2 = new Computer(new LenovoCPU, new LenovoVideoCard, new LenovoMemory);
- c2->work();
- delete c2;
- cout << "***********************" << endl;
- //组装第三台电脑
- Computer* c3 = new Computer(new LenovoCPU, new IntelVideoCard, new LenovoMemory);
- c3->work();
- delete c3;
- }
- void main()
- {
- test01();
- system("pause");
- }
首先把CPU,显卡,内存条做成基类并各自添加纯虚函数,强制派生类进行重写。
然后创建Computer类,封装三个零件类的指针,在电脑类的有参构造中传入三个零件的指针并赋值,提供work函数调用各个零件的功能函数。在程序结束之前编译器会自动调用析构,所以我提供一个电脑类的析构函数,释放掉三个零件的指针。
接下来提供两个品牌,有Intel和Lenovo两个品牌的三种零件。对每个品牌的三个零件类进行继承并重写功能函数,提示具体品牌的零件做了什么具体的功能。
最后创建三个电脑,将零件进行组装,可以全部都是Intel也可以都是Lenovo也可以混合着组装。利用new开辟电脑类,直接使用有参构造,将new出来的零件类传给对应的父类指针,完成多态的使用。电脑类创建完毕后调用work函数使电脑运行,随后就将堆区指针删除,防止内存泄露。

在最后庆祝C++多态完美学习结束,学习完知识再完成练习的学习方法真的很赞,希望给大家带来了帮助,下篇博客不见不散!!!