You are on page 1of 6

ПРАКТИЧЕСКО УПРАЖНЕНИЕ No 5

НАСЛЕДЯВАНЕ. ПРОИЗВОДНИ КЛАСОВЕ

1. Цел на упражнението
Усвояване на практически умения за работа с производни
класове. Запознаване с графичната библиотека на С++.

2. Предназначение, принципи и начин на използване на


механизма на наследяване в С++
Една от причините да се използва механизма на наследяване е, че
той позволява да се пишат универсални програми, като в същото време
предоставя гъвкавостта при необходимост с малко усилия да се
донастрои кода към новото приложение. Прилагането на наследяване е
полезно и в сучаите, когато един проект изисква използването на
няколко твърде подобни, но все пак различаващи се класове.
Механизмът на наследяване позволява един клас да наследи
избрани членове от друг клас, при което да ги използва като свои
собствени. Наследяването се осъществява чрез дефиниране на
производни класове. Отношенията между основен и производен клас са
известни като наследствена йерархия.
• При просто наследяване производния клас наследява членове само
от един основен клас. Производен клас може да бъде основен за друг
клас. Класът, който е корен на йерархията, се нарича абстрактен
суперклас.
• Множественото наследяване дефинира връзки между независими
класове и се представя чрез наследствен граф. Множественото
наследяване позволява да се дефинират класове, които наследяват
членове от няколко основни класа.
Декларацията на обект от производен клас не се различава от
декларацията на всеки друг обект. В дефиницията на основен клас има
две особености:
1. Членовете на основния клас, които не бива да бъдат общодостъпни,
но трябва да са достъпни за производните класове, се дефинират в
секция protected.
2. Онези методи на основен клас, чийто начин на работа зависи от
неизвестни детайли в реализацията на производните класове, се
декларират като виртуални.
Дефинициите на "обикновен" и производен клас се различават
само по заглавната част. За производен клас тя включва списък от
основни класове, от които произлиза дадения клас. Броят на основните
класове може да бъде произволен, но всеки основен клас трябва да се
среща само веднъж в списъка. Основните класове се дефинират
предварително.

1
Производният клас има достъп като към собствени членове до
всички членове от секции public и protected на основния клас.
При множествено наследяване всеки основен клас трябва да
притежава атрибут public или private. Ако атрибутът на основен клас е
public, то наследените от него членове запазват своето ниво на достъп
и в производния клас. В наследствена йерархия, при която всеки базов
клас е public, всеки клас от съответната верига на наследявания има
достъп до всички public и protected членове на предходните базови
класове. В наследствена йерархия, в която основните членове са
private, всеки наследен public или protected член става private член на
производния клас.
Конструкторът на основен клас получава стойности за параметрите
си чрез списък за инициализация, включен в дефиницията на
конструктора на производния клас. В случай на множествено
наследяване в списъка за инициализация може да присъства името на
всеки основен клас.

3. Използвани графични функции от библиотеката на С++


Прототипите на вградените графични функции са декларирани в
заглавния файл <graphics.h>. Необходимо е в опциите на свързващия
редактор да се добави използването на стандартната графична
библиотека GRAPHICS.LIB. Чрез файловете *.BGI и *.CHR се осигурява
използването на широк клас графични устройства с набор от шрифтове
за текст в графичен режим.
Всички графични функции са използваеми само в графичен режим
на видеомонитора. Превключването от текстов в графичен режим се
извършва чрез фукцията initgraph, а обратното превключване става с
функцията closegraph. По-долу са представени декларациите и
функционалното предназначение на графичните функциите, които ще
бъдат използвани в настоящето и следващото упражнение.
• initgraph - инициализира графичната система
int graphdriver = DETECT, graphmode;
initgraph(&graphdriver,&graphmode,"\\bc\\bgi");
• putpixel( int x, int y, int color) - запалва пиксел в точка с координати
x,y с цвят color.
• int getcolor( void ) - връща текущия цвят за изчертаване.
• int getbkcolor( void ) - връща цвета на текущия фон.
• setcolor( int ) - установява цвят за чертане.
• circle( int x, int y, int radius ) - чертае окръжност с център (x,y) и
зададен радиус.
• rectangle( int left, int top, int right, int bottom) - чертае правоъгълник с
координати на горен ляв и долен десен ъгъл.
• getmaxx( int ) - връща максималната X координата.
• getmaxy( int ) - връща максималната Y координата.

2
• getmaxcolor( int ) - връща максималната стойност на цвета.
• floodfill( int x, int y, int border ) - запълва затворен с цвят border
контур; x, y - координати на точка от областта.
• arc( int x, int y, int stangle, int endangle, int radius) - чертае дъга от
окръжност; x,y - координати на центъра; radius - радиус; stangle,
endangle - начален и краен ъгъл в градуси.

4. Задачи за изпълнение

Задача 1:
Да се разгледа, обсъди и изпълни програмата от фиг.5.1

Задача 2:
Да се добави друг обект от клас Vehicle, наречен велосипед
(bicycle) и да се тестват възможнитe за него методи. Да се добави обект
ford от клас Car и се извикат всички достъпни за обекта методи.

Задача 3:
Да се добавят два нови класа, луксозен автомобил (LuxCar) и
спортен автомобил (SportsCar) в йерархията от фиг. 5.1, наследяващи
класа Car. Да се добавят нови признаци, характеризиращи класовете и
съответни методи за използването им.

Задача 4:
Дадени са декларациите на класа Location и класа Point.
class Location
{
public:
Location( int, int );
~Location() { } // деструктор
int getX( void );
int getY( void );
protected:
int X; // хоризонтална координата на точката
int Y; // вертикална координата на точката
};
class Point : public Location
{
public:
Point( int, int );
~Point() { } // деструктор
void show( void );
void hide( void );
boolean isVisible( void );
void moveTo( int, int );
protected:
boolean visible; // флаг, показващ дали точката е визуализирана или скрита;
};

3
Да се дефинират следните методи, декларирани в клас Location:
• getX - връща текущата стойност на X;
• getY - връща текущата стойност на Y;
Да се дефинират следните методи, декларирани в клас Point:
• show - визуализира точката с цвета по подразбиране;
• hide - скрива точката;
• isVisible - връща стойността на visible;
• moveTo - премества точката на нови координати;
Направените дефиниции да се тестват за различни обекти.

Задача 5:
Дадени са декларациите на класа Circle.
class Circle : public Point
{
public:
Circle( int, int, int );
~Circle() { } // деструктор
void show( void );
void hide( void );
void moveTo( int, int );
void expand( int);
void contract( int );
private:
int radius; \\ радиус на окръжността
};
Да се дефинират следните методи, декларирани в клас Circle:
• show - чертае окръжност със зададени център и радиус;
• hide - скрива окръжността;
• moveTo - премества окръжността на нови координати на центъра;
• expand - разширява окръжността чрез увеличаване на радиуса;
• contract - свива окръжността.
Направените дефиниции да се тестват за различни обекти.

Задача 6:
Да се декларира клас Rectangle, наследяващ класа Point и
членове-данни "дължина" и "ширина". Да се дефинират методи,
аналогични на тези от клас Circle. Направените дефиниции да се тестват
за различни обекти.

4
#include <iostream.h>
class Vehicle
{
protected:
int wheels; // брой колела
float weight; // тегло
public:
void initialize( int inWheels, float inWeight);
int getWheels( void );
float getWeight( void );
float wheelLoading( void );
}; // end class Vehicle

class Car : public Vehicle


{
private:
int passengerLoad; // брой пътници
public:
void initialize(int inWheels, float inWeight, int people = 4);
int passengers( void );
}; // end class Car

class Тruck : public Vehicle


{
private:
int passengerLoad;
float payLoad;
public:
void initTruck( int howMany = 2, float maxLoad = 24000.0);
float efficiency( void ); // коефициент за полезен товар
int passengers( void );
}; // end class Truck

void main( void )


{
Vehicle tricycle;
tricycle.initialize(3, 37.5);
cout << "Триколката има " << tricycle.getWheels() << " колела.\n";
cout << "Натоварването, което се поема от едно колело на триколката е " <<
tricycle.wheelLoading() << "\n";
cout << "Триколката тежи " << tricycle.getWeight() << " килограма.\n\n";
Car sedan;
sedan.initialize(4, 3500.0, 5);
cout << "Седанът вози " << sedan.passengers() << " пътника.\n";
cout << "Седанът тежи " << sedan.getWeight() << " килограма.\n";
cout << "Натоварването на едно колело на седана е " << sedan.wheelLoading()
<< " килограма на всяко колело.\n\n";
Truck zil;
zil.initialize(18, 12500.0);
zil.initTruck(1, 33675.0);
cout << "Зилът тежи" << zil.getWeight() << " килограма.\n";
cout << "Коефициентът на полезен товар е "

5
<< 100.0 * zil.efficiency() << " процента.\n";
} // end main

// функции-членове на клас Vehicle


void Vehicle :: initialize( int inWheels, float inWeight)
{
wheels = inWheels;
weight = inWeight;
}
int Vehicle :: getWheels( void )
//връща броя колела на превозното средство
{
return wheels;
}
float Vehicle :: getWeight( void )
// връща теглото на превозното средство
{
return weight;
}
float Vehicle :: wheelLoading( void )
// връща разпределеното тегло
{
return weight/wheels;
}
// функции-членове на клас Car
void Car :: initialize(int inWheels, float inWeight, int people)
{
passengerLoad = people;
wheels = inWheels;
weight = inWeight;
}
int Car :: passengers(void)
{
return passengerLoad;
}
// функции-членове на клас Truck
void Truck :: initTruck( int howMany, float maxLoad)
{
passengerLoad = howMany;
payLoad = maxLoad;
}
float Truck :: efficiency( void )
{
return payLoad / (payLoad + weight);
}
int Truck :: passengers( void )
{
return passengerLoad;
}

Фиг. 5.1

You might also like