Программирование >>  Дополнительные возможности наследования 

1 ... 123 124 125 [ 126 ] 127 128 129 ... 265


Например, предположим, что класс Horse производится от двух классов - Animal и Displayable, причем последний добавляет только новые методы, но не содержит данных. В таком случае все наследуемые данные класса Horse происходят только от одного базового класса Animal, а методы наследуются от обоих классов.

Классы-мандаты (capability class) иногда еше называют миксинами (mixin). Этот термин произошел от названия десерта, представляющего собой смесь пирожного с мороженым, политую сверху шоколадной глазурью. Этот десерт продавался в супермаркетах Sommerville в штате Массачусетс. Видимо, это блюдо когда-то попробовал один из профаммистов, занимающийся разработкой средств объектно-ориентированного профаммирования для языка SCOOPS, где этот термин впервые появился.

йОсшракгоиыв топы данных

в объектном профаммировании довольно часто создаются иерархии логически связанных классов. Например, представим класс Shape, от которого произведены классы Rectangle и Circle. Затем от класса Rectangle производится класс Square, как частный вид прямоугольника.

В каждом из производных классов замещаются методы Draw(), GetAreaO и др. Основной костяк программы с классом Shape и производными от него Rectangle и Circle показан в листинге 13.7.

Шшм 13.7. Киассы ccMclcfflBi Skapi

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

ftinclude <iostream.h>

class Shape {

public:

ShapeO{ } virtual Shape(){ }

virtual long GetAreaO { return -1; }

virtual long GetPerimO { return -1; }

virtual void Draw() { } private: } ;

class Circle : public Shape {

public:

Circle(int radius):itsRadius(radius){ } Circle(){ }

long GetAreaO { return 3 * itsRadius * itsRadius; } long GetPerimO { return 6 itsRadius; } void DrawO; private:

int itsRadius;



27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76

int itsCircumference;

void Circle::Draw() {

cout Circle drawing routine here!\ n ;

class Rectangle : public Shape {

public:

Rectangle(int len, int width): ,* Г * itsLength(len), itsWidth(width){ } virtual Rectangle(){ }

virtual long GetAreaO { return itsLength itsWidth; } virtual long GetPerim() { return 2*itsLength + 2*itsWidth; } virtual int GetLengthO { return itsLength; } virtual int GetWidthO { return itsWidth; } virtual void Draw(); private:

int itsWidth;

int itsLength;

void Rectangle;:Draw() {

for (int 1 = 0; KitsLength; 1++) {

for (int j = 0; j<itsWidth; j++) cout x ;

cout \ n ;

>

>

class Square : public Rectangle {

public:

Square(int len); Square(int len, int width); Square(){ }

long GetPerimO { return 4 * GetLength(); >

Square::Square(int len): Rectangle(len,len)

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



77: Rectangleden,width) 78:

79: {

80: if (GetLengthO != GetWidthO)

81: cout Error, not a square... a Rectangle??\ n ;

82: >

84: int mainO 85: {

86: int choice;

87: bool fOuit = false;

88: Shape * sp;

90; while ( ! fOuit )

91: {

92: cout (l)Circle (2)Rectangle (3)Square (O)Quit: ;

93: cin choice;

95: switch (choice)

96: {

97: case 0: fOuit = true;

98: break;

99: case 1: sp = new Gircle(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(! fOuit)

110: sp->Draw();

111: delete sp;

112: cout \ n ;

113: }

114; return 0;

115: }

(DCircle (2)Rectangle (3)Square (O)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

(l)Gircle (2)Rectangle (3)Square (0)Quit:3

X X X X X



1 ... 123 124 125 [ 126 ] 127 128 129 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика