// 继第6题， 基于多态方式，定义一个全局函数排序函数，接收Shape类的数组，并按形状的周长进行从大到少排序。
// 【提示】全局函数排序函数 void sort(Shape *arr, int size)
#include <iostream>
#include <cstring>
#include <cstdlib>

using namespace std;

class Shape
{
public:
    // 用于计算形状的周长
    virtual double perimeter() = 0;
};

class Triangle : public Shape
{
private:
    double a, b, c;

public:
    Triangle(double a, double b, double c) : a(a), b(b), c(c) {}

public:
    double perimeter()
    {
        return a + b + c;
    }
};

class Square : public Shape
{
private:
    double a;

public:
    Square(double a) : a(a) {}

public:
    double perimeter()
    {
        return 4 * a;
    }
};

void sort(Shape *arr[], int size) // 这里为什么传指针数组？因为 Shape 是抽象类，不能实例化对象，只能通过指针来操作
{
    for (int i = 0; i < size - 1; i++)
    {
        for (int j = 0; j < size - i - 1; j++)
        {
            // 比较形状的周长
            if (arr[j]->perimeter() < arr[j + 1]->perimeter())
            {
                // 交换位置
                swap(arr[j], arr[j + 1]);
            }
        }
    }
}

int main()
{
    Shape *p = new Triangle(3, 4, 5);
    Shape *q = new Square(5);
    Shape *r = new Triangle(6, 8, 10);
    Shape *s = new Square(10);
    Shape *t = new Triangle(5, 12, 13);
    Shape *u = new Square(13);
    // Shape *arr[6];
    // arr[0] = p;
    // arr[1] = q;
    Shape *arr[] = {p, q, r, s, t, u}; // arr作为一个指针数组，存了6个指向 Shape 类对象的指针
    int len = sizeof(arr) / sizeof(arr[0]);

    cout << "排序前：" << endl;

    for (int i = 0; i < len; i++)
    {
        cout << arr[i]->perimeter() << endl;
    }

    sort(arr, len);

    cout << "排序后：" << endl;
    for (int i = 0; i < len; i++)
    {
        cout << arr[i]->perimeter() << endl;
    }

    return 0;
}
