Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Листинг 13.7. Классы семейства Shape






1: // Листинг 13.7. Классы семейства Shape

2:

3: #include < iostream.h>

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: {

54: for (int i = 0; i< itsLength; i++)

55: {

56: for (int j = 0; j< itsWidth; j++)

57: cout < < " x ";

58:

59: cout < < " \n";

60: }

61: }

62:

63: class Square: public Rectangle

64: {

65: public:

66: Square(int len);

67: Square(int len, int width);

68: ~Square() { }

69: long GetPerim() { return 4 * GetLength(); }

70: };

71:

72: Square:: Square(int len):

73: Rectangle(len, len)

74: { }

75:

76: Square:: Square(int len, int width):

77: Rectangle(len, width) 78:

79: {

80: if (GetLength()! = GetWidth())

81: cout < < " Error, not a sguare... a Rectangle?? \n";

82: }

83:

84: int main()

85: {

86: int choice;

87: bool fQuit = false;

88: Shape * sp;

89:

90: while (! fQuit)

91: {

92: cout < < " (1)Circle (2)Rectangle (3)Square (0)Quit: ";

93: cin > > choice;

94:

95: switch (choice)

96: {

97: case 0: fQuit = true;

98: break;

99: case 1: sp = new Circle(5);

100: break;

101: case 2: sp = new Rectangle(4, 6);

102: break;

103: case 3: sp = new Square(5);

104: break;

105: default: cout < < " Please enter a number between 0 and 3" < < endl;

106: continue;

107: break;

108: }

109: if(! fQuit)

110: sp-> Draw();

111: delete sp;

112: cout < < " \n";

113: }

114: return 0;

115: }

 

Результат:

(1)Circle (2)Rectangle (3)Square (0)Quit: 2

x x x x x x

X X X X X X

X X X X X X

X X X X X X

(1)Circle (2)Rectangle (3)Square (0)Quit: 3

X X X X X

X X X X x

X X X X X

X X X X X

X X X X X

(1)Circle (2)Rectangle (3)Square (0)Quit: 0

 

Анализ: В строках 6—15 объявляется класс Shape. Методы GetArea() и GetPerim() возвращают -1 как сообщение об ошибке, а метод Draw() не выполняет никаких действий. Давайте подумаем, можно ли в принципе нарисовать форму? Можно нарисовать окружность, прямоугольник или квадрат, но форма — это абстракция, которую невозможно изобразить.

Класс Circle производится от класса Shape, и в нем замещаются три виртуальных метода. Обратите внимание, что в данном случае нет необходимости использовать ключевое слово virtual, поскольку виртуальность функций наследуется в производном классе. Тем не менее для напоминания о виртуальности используемых функций не лишним будет явно указать это.

Класс Square производится от класса Rectangle и наследует от него все методы, причем метод GetPerim() замещается в новом классе.

Все методы должны функционировать нормально в производных классах, но не в базовом классе Shape, поскольку невозможно создать экземпляр формы как таковой. Программа должна быть защищена от попытки пользователя создать объект этого класса. Класс Shape существует только для того, чтобы поддерживать интерфейс, общий для всех производных классов, поэтому об этом типе данных говорят как об абстрактном, или ADT (Abstract Data Туре).

Абстрактный класс данных представляет общую концепцию, такую как форма, а не отдельные объекты, такие как окружность или квадрат. В C++ ADT по отношению к другим классам всегда выступает как базовый, для которого невозможно создать функциональный объект абстрактного класса.


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.007 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал