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