@@ -9,8 +9,7 @@ struct Shape { //抽象基类,这个类用来表示各种几何图形
99 return rad * 180 / Pi;
1010 }
1111 virtual double perimeter ()const = 0; // 周长,纯虚函数
12- virtual double area ()const = 0; // 周长,纯虚函数
13- virtual ~Shape () {} // 析构,虚函数
12+ virtual double area ()const = 0; // 面积,纯虚函数
1413};
1514class Triangle : public Shape { // 三角形
1615 double _a;
@@ -19,8 +18,8 @@ class Triangle : public Shape { //三角形
1918public:
2019 Triangle (double a, double b, double c)
2120 : _a {a}, _b {b}, _c {c} {} // 构造函数
22- virtual double perimeter ()const { return _a + _b + _c; } // 周长
23- virtual double area ()const { // 面积
21+ double perimeter ()const { return _a + _b + _c; } // 周长
22+ double area ()const { // 面积
2423 double s {(_a + _b + _c) / 2 };
2524 return std::sqrt (s * (s - _a) * (s - _b) * (s - _c));
2625 }
@@ -29,8 +28,8 @@ class Circle : public Shape { //圆形
2928 double _r; // 圆的半径
3029public:
3130 Circle (double r) : _r {r} {}
32- virtual double perimeter ()const { return 2 * Pi * _r; } // 周长
33- virtual double area ()const { return Pi * _r * _r; } // 面积
31+ double perimeter ()const { return 2 * Pi * _r; } // 周长
32+ double area ()const { return Pi * _r * _r; } // 面积
3433};
3534class Parallelogram_abc : public Shape { // 抽象平行四边形基类
3635protected:
@@ -47,17 +46,34 @@ class Parallelogram : public Parallelogram_abc { //平行四边形
4746 double perimeter ()const { return 2 * (_a + _b); }
4847 double area ()const { return _a * _b * std::sin (Deg2Rad (_theta)); }
4948};
50- struct Rhombus_abc : Parallelogram_abc { // 抽象菱形基类
51- double perimeter ()const { return 4 * _a; }
52- Rhombus_abc (double a) : Parallelogram_abc {a} {} // 构造函数
49+ struct Rhombus_abc : virtual public Parallelogram_abc { // 抽象菱形基类
50+ Rhombus_abc (double a) : Parallelogram_abc {a} {}
51+ double perimeter ()const { return 4 * _a; } // 菱形、正方形通用的周长公式
52+ };
53+ struct Rectangle_abc : virtual public Parallelogram_abc { // 抽象矩形基类
54+ Rectangle_abc (double a) : Parallelogram_abc {a} {}
5355};
5456class Rhombus : public Rhombus_abc { // 菱形
5557 double _theta;
5658public:
57- Rhombus (double a, double theta) : Rhombus_abc {a}, _theta {theta} {}
59+ Rhombus (double a, double theta)
60+ : Parallelogram_abc {a}, Rhombus_abc {a}, _theta {theta} {}
61+ // 因为Rhombus_abc虚继承自Parallelogram_abc,我们必须单独调用后者的构造函数
62+ // 又因为Rhombus继承自Rhombus_abc,我们必须调用后者的构造函数
5863 double area ()const { return _a * _a * std::sin (Deg2Rad (_theta)); }
5964};
60- struct Square : Rhombus_abc { // 正方形
61- Square (double a) : Rhombus_abc {a} {}
65+ class Rectangle : public Rectangle_abc { // 矩形
66+ double _b;
67+ public:
68+ Rectangle (double a, double b)
69+ : Parallelogram_abc {a}, Rectangle_abc {a}, _b {b} {}
70+ // 同上,不再赘述
71+ double perimeter ()const { return 2 * (_a + _b); }
72+ double area ()const { return _a * _b; }
73+ };
74+ struct Square : Rhombus_abc, Rectangle_abc { // 正方形
75+ Square (double a)
76+ : Parallelogram_abc {a}, Rhombus_abc {a}, Rectangle_abc {a} {}
6277 double area ()const { return _a * _a; }
78+ // perimeter函数继承自Rhombus_abc足矣,不必再写
6379};
0 commit comments