c/c++语言开发共享C++多态的示例详解

今天就以三个案例来把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删除指针。注意删除指针只是删除了那一块地址,该指针的类型是不变的,还可以多次利用,指向不同的子类对象。

运行效果

C++多态的示例详解

案例二:制作饮品

案例要求

给出制作饮品的过程为四步:把水煮开、冲泡、倒入杯中、加入佐料。

利用多态写出两个饮品的制作过程

代码实现

#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删除堆区父类指针,以免内存泄漏。

运行效果

C++多态的示例详解

案例三:电脑组装

案例要求

电脑主要组成部件为 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++多态的示例详解

以上就是c++多态的示例详解的详细内容,更多关于c++多态的资料请关注<计算机技术网(www.ctvol.com)!!>其它相关文章!

需要了解更多c/c++开发分享C++多态的示例详解,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/1237380.html

(0)
上一篇 2022年9月7日
下一篇 2022年9月7日

精彩推荐