Абстрактные типы данных
В объектном программировании довольно часто создаются иерархии логически связанных классов. Например, представим класс Shape, от которого произведены классы Rectangle и Circle. Затем от класса Rectangle производится класс Sguare, как частный вид прямоугольника.
В каждом из производных классов замещаются методы Draw, GetArea и др. Основной костяк программы с классом Shape и производными от него Rectangle и Circle показан в листинге 13.7.
Листинг 13.7. Классы семейства Shape
1: // Листинг 13.7. Классы семейства Shape
2:
3: #include
4:
5:
6: class Shape
7: {
8: public:
9: Shape{ }
10: virtual ~Shape { }
11: virtual long GetArea { return -1; }
12: virtual long GetPerim { return -1; }
13: virtual void Draw { }
14: private:
15: };
16:
17: class Circle : public Shape
18: {
19: public:
20: Circle(int radius):itsRadius(radius) { }
21: ~Circle { }
22: long GetArea { return 3 * itsRadius * itsRadius; }
23: long GetPerim { return 6 * itsRadius; }
24: void Draw;
25: private:
26: int itsRadius;
27: int itsCircumference;
28: };
29:
30: void Circle::Draw
31: {
32: cout << "Circle drawing routine here!\n";
33: }
34:
35:
36: class Rectangle : public Shape
37: {
38: public:
39: Rectangle(int len, int width);
40: itsLength(len), itsWidth(width) { }
41: virtual ~Rectangle { }
42: virtual long GetArea { return itsLength * itsWidth; }
43: virtual long GetPerim { return 2*itsLength + 2*itsWidth; }
44: virtual int GetLength { return itsLength; }
45: virtual int GetWidth { return itsWidth; }
46: virtual void Draw;
47: private:
48: int itsWidth;
49: int itsLength;
50: };
51:
52: void Rectangle::Draw
53: {