• 自考新教材-p255


    使用多态处理图形示例

    源程序:

    #include <iostream>

    #include <cmath>

    using namespace std;

    class CShape

    {

    protected:

      double acreage;

    public:

      CShape()

       {

        //cout<<"基类构造函数"<<endl;

      };

       virtual ~CShape()

       {

        //cout<<"基类析构函数"<<endl;

      }

      virtual double CalAcr()

      {

        return 0;

       };

       virtual void setAcreage(double acre){};

       virtual void PrintInfo(){};

    };

    class CRectangle:public CShape

    {

       double width,high;

    public:

       CRectangle(double w,double h)

      {

         //cout<<"矩形带参构造函数"<<endl;

         width = w;

         high = h;

      };

      CRectangle()

      {

        //cout<<"矩形无参构造函数"<<endl;

        width = 0;

         high = 0;

       };

       ~CRectangle()

      {

        //cout<<"矩形析构函数"<<endl;

      }

      virtual double CalAcr();

      virtual void PrintInfo();

      virtual void setAcreage(double);

    };

    class CCircle:public CShape

    {

      double radius;

    public:

      CCircle(double r)

      {

      //cout<<"圆形带参构造函数"<<endl;

      radius = r;

      };

      CCircle()

      {

        //cout<<"圆形无参构造函数"<<endl;

        radius = 0;

      };

      ~CCircle()

      {

        //cout<<"圆形析构函数"<<endl;

      }

      virtual double CalAcr();

      virtual void PrintInfo();

      virtual void setAcreage(double);

    };

    class CTriangle:public CShape

    {

      double a,b,c;

    public:

      CTriangle(double a,double b,double c)

       {

        //cout<<"三角形带参构造函数"<<endl;

        this->a=a;

        this->b=b;

        this->c=c;

      };

      CTriangle()

      {

        //cout<<"三角形无参构造函数"<<endl;

        a=0;

        b=0;

        c=0;

      };

      ~CTriangle()

       {

        //cout<<"三角形析构函数"<<endl;

      };

       virtual double CalAcr();

       virtual void PrintInfo();

      virtual void setAcreage(double);

    };

    double CRectangle::CalAcr()

    {

       return width*high;

    }

    void CRectangle::PrintInfo()

    {

       cout<<"矩形. 宽度="<<this->width<<",高度 ="<<this->high<<", 面积"<<this->acreage<<endl;

    }

    void CRectangle::setAcreage(double acre)

    {

      acreage = acre;

    }

     

    double CCircle::CalAcr()

    {

      return 3.14*radius*radius;

    }

    void CCircle::PrintInfo()

    {

      cout<<"圆. 半径="<<this->radius<<",面积"<<this->acreage<<endl;

    }

    void CCircle::setAcreage(double acre)

    {

      acreage = acre;

    }

     

    double CTriangle::CalAcr()

    {

      double p = (a+b+c)/2.0;

      return sqrt(p*(p-a)*(p-b)*(p-c));

    }

    void CTriangle::PrintInfo()

    {

      cout<<"三角形.三条边分别是: "<<this->a<<","<<this->b<<","<<this->c<<",面积="<<this->acreage<<endl;

    }

    void CTriangle::setAcreage(double acre)

    {

      acreage = acre;

    }

    CShape * pShapes[100];

     

    int main()

    {

      int i,n;

       double temp1,temp2,temp3;

       CRectangle *pr;CCircle *pc;CTriangle *pt;

       cin>>n;

       for(i=0;i<n;++i)

       {

        char c;

         cin>>c;

        switch(c)

         {

        case'R':case'r':

          cin>>temp1>>temp2;

          pr=new CRectangle(temp1,temp2);

          pr->setAcreage(pr->CalAcr());

          pShapes[i]=pr;

          break;

        case'C':case'c':

          cin>>temp1;

          pc=new CCircle(temp1);

          pc->setAcreage(pc->CalAcr());

          pShapes[i]=pc;

           break;

        case'T':case't':

          cin>>temp1>>temp2>>temp3;

          pt=new CTriangle(temp1,temp2,temp3);

          pt->setAcreage(pt->CalAcr());

          pShapes[i]=pt;

          break;

        }

      }

      if(n==1)

        cout<<"共有 "<<n<<"种图形,它是"<<endl;

      else

        cout<<"共有 "<<n<<"种图形,分别是"<<endl;

      for(i=0;i<n;++i)

       {

        //cout<<"1"<<endl;

        pShapes[i]->PrintInfo();

        delete pShapes[i];

       }

       system("pause");

      return 0;

    }

    运行结果:

  • 相关阅读:
    聊聊 print 的前世今生
    在树莓派里搭建 Lighttpd 服务器
    如何重复执行一条命令直至运行成功?
    手把手教你Windows Linux双系统的安装与卸载
    你以为只有马云会灌鸡汤?Linux 命令行也会!
    Linux 下三种提高工作效率的文件处理技巧
    太高效了!玩了这么久的Linux,居然不知道这7个终端快捷键!
    Linux下分析bin文件的10种方法
    Linux下几个与磁盘空间和文件尺寸相关的命令
    如何让你的脚本可以在任意地方都可执行?
  • 原文地址:https://www.cnblogs.com/duanqibo/p/12183280.html
Copyright © 2020-2023  润新知