关于C++多态的一个例子

来源:互联网 发布:不合格品的数据分析 编辑:程序博客网 时间:2024/06/05 09:16

#include <iostream>
#include <cmath>

using namespace std;

class Shape
{
    public:
        Shape() {}
        virtual ~Shape() = 0;
        virtual double getPerimeter() = 0;
        virtual double getArea() = 0;
};

Shape::~Shape() { }    //①能不能不写??为什么??

class Triangle: public Shape
{
    public:
        Triangle() {}
        Triangle(double a, double b, double c):a(a),b(b),c(c) {}
        //Triangle(const Triangle &copy):a(copy.a),b(copy.b),c(copy.c) {}
        Triangle& operator=(const Triangle& assign)
        {
            if (this != &assign)
            {
                a = assign.a;
                b = assign.b;
                c = assign.c;
            }
            return *this;
        }
        virtual ~Triangle() {}
       
        virtual double getPerimeter()
        {
            return a+b+c;
        }
        virtual double getArea()
        {
            double q = (a+b+c)/2;
            return sqrt(q*(q-a)*(q-b)*(q-c));
        }
    private:
        double a;
        double b;
        double c;
};

class Rectangle:public Shape
{
    public:
        Rectangle() {}
        Rectangle(double h,double w):height(h),width(w) //②调换顺序,如何??
        { }
        virtual ~Rectangle() {}
       
        virtual double getPerimeter()
        {
            return 2 * (width + height);
        }
       
        virtual double getArea()
        {
            return width * height;                    //③假如Rectangle有一个独有的成员函数,问如何利用动态绑定技术实现??
        }
    private:
        double height;
        double width;
};

int main()
{
    Shape *shape[2];
    shape[1] = new Rectangle(1.0, 2.0);
    shape[0] = new Triangle(3.0, 4.0, 5.0);
   
    for (int i = 0; i < 2; ++i)
    {
        if (typeid(*shape[i]) == typeid(Triangle))   //④typeid用法??
            cout << "这是一个三角形" << endl;
        else if (typeid(*shape[i]) == typeid(Rectangle))
            cout << "这是一个矩形" << endl;
        cout << "周长为:" << shape[i]->getPerimeter() << " ";
        cout << "面积为:" << shape[i]->getArea() << endl;
    }
   
    delete shape[0];
    delete shape[1];
    return EXIT_SUCCESS;
}

原创粉丝点击