@@ -9,8 +9,7 @@ struct Shape { //抽象基类,这个类用来表示各种几何图形
9
9
return rad * 180 / Pi;
10
10
}
11
11
virtual double perimeter ()const = 0; // 周长,纯虚函数
12
- virtual double area ()const = 0; // 周长,纯虚函数
13
- virtual ~Shape () {} // 析构,虚函数
12
+ virtual double area ()const = 0; // 面积,纯虚函数
14
13
};
15
14
class Triangle : public Shape { // 三角形
16
15
double _a;
@@ -19,8 +18,8 @@ class Triangle : public Shape { //三角形
19
18
public:
20
19
Triangle (double a, double b, double c)
21
20
: _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 { // 面积
24
23
double s {(_a + _b + _c) / 2 };
25
24
return std::sqrt (s * (s - _a) * (s - _b) * (s - _c));
26
25
}
@@ -29,8 +28,8 @@ class Circle : public Shape { //圆形
29
28
double _r; // 圆的半径
30
29
public:
31
30
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; } // 面积
34
33
};
35
34
class Parallelogram_abc : public Shape { // 抽象平行四边形基类
36
35
protected:
@@ -47,17 +46,34 @@ class Parallelogram : public Parallelogram_abc { //平行四边形
47
46
double perimeter ()const { return 2 * (_a + _b); }
48
47
double area ()const { return _a * _b * std::sin (Deg2Rad (_theta)); }
49
48
};
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} {}
53
55
};
54
56
class Rhombus : public Rhombus_abc { // 菱形
55
57
double _theta;
56
58
public:
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,我们必须调用后者的构造函数
58
63
double area ()const { return _a * _a * std::sin (Deg2Rad (_theta)); }
59
64
};
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} {}
62
77
double area ()const { return _a * _a; }
78
+ // perimeter函数继承自Rhombus_abc足矣,不必再写
63
79
};
0 commit comments