Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Освой ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π‘++ Π·Π° 21 дСнь.Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 87

Автор ДТСсс Π›ΠΈΠ±Π΅Ρ€Ρ‚ΠΈ

ΠšΠ»Π°ΡΡΡ‹-ΠΌΠ°Π½Π΄Π°Ρ‚Ρ‹

ΠŸΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΌ ΠΈ мноТСствСнным наслСдованиСм классов ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использованиС классов-ΠΌΠ°Π½Π΄Π°Ρ‚ΠΎΠ². Π’Π°ΠΊ, класс Horse ΠΌΠΎΠΆΠ½ΠΎ произвСсти ΠΎΡ‚ Π΄Π²ΡƒΡ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов β€” Animal ΠΈ Displayable, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ послСдний добавляСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ отобраТСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° экранС.

Классом-ΠΌΠ°Π½Π΄Π°Ρ‚ΠΎΠΌ называСтся класс, ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ доступ ΠΊ ряду ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π½ΠΎ Π½Π΅ содСрТащий Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… (ΠΈΠ»ΠΈ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, содСрТащий ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ…).

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ класса-ΠΌΠ°Π½Π΄Π°Ρ‚Π° ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ классы с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ наслСдования. ЕдинствСнноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ классов-ΠΌΠ°Π½Π΄Π°Ρ‚ΠΎΠ² ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… классов состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ практичСски Π½Π΅ содСрТат Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…. Π Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ довольно ΡΡƒΠ±ΡŠΠ΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΈ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±Ρ‰ΡƒΡŽ Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΡŽ программирования, ΡΠ²ΠΎΠ΄ΡΡ‰ΡƒΡŽΡΡ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ классам Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ услоТнСниСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ИспользованиС классов-ΠΌΠ°Π½Π΄Π°Ρ‚ΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ сниТаСт Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ возникновСния нСопрСдСлСнностСй ΠΏΡ€ΠΈ использовании Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС Π΄Π°Π½Π½Ρ‹Ρ…, унаслСдованных ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов.

НапримСр, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ класс Horse производится ΠΎΡ‚ Π΄Π²ΡƒΡ… классов β€” Animal ΠΈ Displayable, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ послСдний добавляСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΠΎΠ²Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Π½ΠΎ Π½Π΅ содСрТит Π΄Π°Π½Π½Ρ‹Ρ…. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС всС наслСдуСмыС Π΄Π°Π½Π½Ρ‹Π΅ класса Horse происходят Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Animal, Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚ ΠΎΠ±ΠΎΠΈΡ… классов.

ΠšΠ»Π°ΡΡΡ‹-ΠΌΠ°Π½Π΄Π°Ρ‚Ρ‹ (capability class) ΠΈΠ½ΠΎΠ³Π΄Π° Π΅Ρ‰Π΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ миксинами (mixin). Π­Ρ‚ΠΎΡ‚ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π» ΠΎΡ‚ названия дСсСрта, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ собой смСсь ΠΏΠΈΡ€ΠΎΠΆΠ½ΠΎΠ³ΠΎ с ΠΌΠΎΡ€ΠΎΠΆΠ΅Π½Ρ‹ΠΌ, ΠΏΠΎΠ»ΠΈΡ‚ΡƒΡŽ свСрху шоколадной Π³Π»Π°Π·ΡƒΡ€ΡŒΡŽ. Π­Ρ‚ΠΎΡ‚ дСсСрт продавался Π² супСрмаркСтах Sommerville Π² ΡˆΡ‚Π°Ρ‚Π΅ ΠœΠ°ΡΡΠ°Ρ‡ΡƒΡΠ΅Ρ‚Ρ. Π’ΠΈΠ΄ΠΈΠΌΠΎ, это блюдо ΠΊΠΎΠ³Π΄Π°-Ρ‚ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π» ΠΎΠ΄ΠΈΠ½ ΠΈΠ· программистов, Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉΡΡ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ срСдств ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования для языка SCOOPS, Π³Π΄Π΅ этот Ρ‚Π΅Ρ€ΠΌΠΈΠ½ Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ появился.

АбстрактныС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…

Π’ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ довольно часто ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ логичСски связанных классов. НапримСр, прСдставим класс Shape, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Ρ‹ классы Rectangle ΠΈ Circle. Π—Π°Ρ‚Π΅ΠΌ ΠΎΡ‚ класса Rectangle производится класс Sguare, ΠΊΠ°ΠΊ частный Π²ΠΈΠ΄ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°.

Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классов Π·Π°ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Draw(), GetArea() ΠΈ Π΄Ρ€. Основной костяк ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с классом Shape ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ ΠΎΡ‚ Π½Π΅Π³ΠΎ Rectangle ΠΈ Circle ΠΏΠΎΠΊΠ°Π·Π°Π½ Π² листингС 13.7.

Листинг 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 ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠΌ классам всСгда выступаСт ΠΊΠ°ΠΊ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ абстрактного класса.

ЧистыС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

C++ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ созданиС абстрактных Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… с чистыми Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ функциями. Чистыми Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ функциями Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

virtual void Draw() = 0;

Класс, содСрТащий чистыС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, являСтся ADT. НСвозмоТно ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ для класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ADT. ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° для Ρ‚Π°ΠΊΠΎΠ³ΠΎ класса Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ сообщСниС ΠΎΠ± ошибкС Π²ΠΎ врСмя компиляции. ΠŸΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π² класс чистой Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

β€’ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° этого класса;

β€’ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ замСщСния чистой Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС.

Π›ΡŽΠ±ΠΎΠΉ класс, ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΎΡ‚ ADT, унаслСдуСт ΠΎΡ‚ Π½Π΅Π³ΠΎ Ρ‡ΠΈΡΡ‚ΡƒΡŽ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ этого класса. Π’Π°ΠΊ, Ссли класс Rectangle наслСдуСтся ΠΎΡ‚ класса Shape, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит Ρ‚Ρ€ΠΈ чистыС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎ Π² классС Rectangle Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ всС эти Ρ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΠ½Π°Ρ‡Π΅ ΠΎΠ½ Ρ‚ΠΎΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ADT. Π’ листингС 13.8 ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ объявлСниС классa Shape Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ стал абстрактным Ρ‚ΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ…. ΠžΡΡ‚Π°Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ листинга 13.7 Π½Π΅ измСнилась, поэтому Π½Π΅ приводится. ΠŸΡ€ΠΎΡΡ‚ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ объявлСниС класса Π² строках 7β€”16 листинга 13.7 листингом 13.8 ΠΈ запуститС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ.

Листинг 13.8. ΠΠ±ΡΡ‚Ρ€Π°ΠΊΡ‚Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… 

1: класс Shape

2: {

3:    public:

4:       Shape(){ }

5:       ~Shape(){ }.

6:       virtual long GetArea() = 0; // ошибка

7:       virtual long GetPerim()= 0;

8:       virtual void Draw() = 0;

9:    private:

10: };


Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

(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


Анализ: Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ измСнилось. ΠŸΡ€ΠΎΡΡ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Shape.


АбстрактныС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ