zoukankan      html  css  js  c++  java
  • c++多态的案例分析

    近期在研究c++中多态的应用 ,当中遇到些许的疑问与问题,可是终于的结果是不容置疑的,以下记录下我的学习过程,以纪念本个知识点。

    首先,是从一个案例開始的,题目大意是这种:

    设定一个多边形的公共类,然后再设定多个图形的各个派生类,最后通过基类,依据多态的应用通过基类,求出所求图形的面积

    于是依据自己所学的知识,開始大致的勾画原始的雏形例如以下:

    #include
    using namespace std;

      class Shape    //基类
      {
      public:
      virtual double area()=0;
      };

    int main ()
    {
     Circle c(5);   //圆參数赋值
     Rectangle r(3,4);  //矩形參数赋值
     Triangle t(3,4);  //三角形赋值
     Shape *p;   //设置一个基类的指针
     p=&c;   //调用求圆面积的方法  求圆的面积
     cout<<p->area()<<endl;
     p=&r;    //调用求矩形面积的方法求矩形面积
     cout<<p->area()<<endl;
     p=&t;    //调用求三角形面积的方法求三角形的面积
     cout<<p->area()<<endl;
     system("pause");
     return 0;
    }

     

    然后,再把一个一个的派生类,加入进去 ,效果例如以下:

    #include
    using namespace std;
    class Shape
    {
    public:
     virtual double  area() =0;
    };

    class Circle: public Shape
    {
    public:
     Circle(double r):radius(r){}
     virtual double area()
     {
      return radius*radius*3.14159;
     }
    private:
     double radius;
    };
    class Rectangle:public Shape
    {
    public:
     Rectangle(double x,double y):x(x),y(y){}
     virtual double area()
     {
      return x*y;
     }
    private:
     double x,y;
    };
    class Triangle:public Shape
    {
    public:
     Triangle(double x,double y):x(x),y(y){}
     virtual double area()
     {
      return x*y/2;
     }
    private:
     double x,y;
    };
    int main ()
    {
     Circle c(1);
     Rectangle r(3,4);
     Triangle t(3,4);
     Shape *p;
     p=&c;
     cout<<p->area()<<endl;
     p=&r;
     cout<<p->area()<<endl;
     p=&t;
     cout<<p->area()<<endl;
     system("pause");
     return 0;
    }

    执行结果:

    相同的道理,还能够这样子写,仅仅是每一个人的习惯不同而已,代码例如以下:

    #include
    using namespace std;
    class shape
    {
    public:
     virtual void area()=0;
    };
     
    class Trangle : public shape
    {
    protected:
     double a,b;
    public:
     Trangle(double a,double b):a(a),b(b){};
     virtual void area()
     {
      cout<<a*b*0.5<<endl;
     }
    };
    class Rectangle:public shape
    {
    protected:
     double a,b;
    public:
     Rectangle(double a,double b):a(a),b(b){}; 
     virtual void area()
     {
      cout<<a*b<<endl;
     }
    };
    class Circle:public shape
    {
    protected:
     double a;
    public:
     Circle(double a):a(a){};
     virtual void  area()
     {
      cout<<3.14*a*a<<endl;
     }
    };
    int main()
    {
     shape *p;
     Trangle t(1,1);
     Rectangle r(1,1);
     Circle c(2);
     p=&t;        // 三角形面积
     p->area() ;
     p=&r;       //矩形面积
     p->area() ;
     p=&c;       // 圆形面积
     p->area();
     return 0;
    }

    当中须要注意的点是: 一定要写成的是公有的派生,即public  不然默认的都是私有的派生。还有在写代码的过程中,一定要注意不要把英语字母写错,当中的一个字母错了,花了我好长时间,最后才检查出来,敲代码的前期大都会遇到这种情况的,我们须要做的就是,认真再认真。

     

  • 相关阅读:
    Leetcode-Partition List
    Leetcode-Gray Code
    Leetcode-Subsets II
    Leetcode-Reverse Linked List II
    Leetcode-Resotre IP Addresses
    Leetcode-Decode Ways
    Leetcode-Trapping Rain Water
    EVA 4400存储硬盘故障数据恢复方案和数据恢复过程
    HP DL380服务器RAID信息丢失数据恢复方法和数据恢复过程分享
    ESXi5.0误删除虚拟机还有办法恢复吗?答案是可以!
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4095697.html
Copyright © 2011-2022 走看看