Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_Посібник (1).doc
Скачиваний:
8
Добавлен:
01.05.2019
Размер:
544.77 Кб
Скачать

§13. Ієрархія успадкування класів

При побудові нового класу є можливість успадковувати не один базовий клас, а декілька. В цьому випадку відбувається множинне успадкування. Щоб вказати, по відношенню до яких базових класів новий клас є похідним, в оголошенні класу перед списком його членів наводиться список базових класів (класів-пращурів). Кожен з базових класів, у свою чергу, може бути похідним від інших базових класів. Отже, ієрархія успадкування класів може бути дуже складною.

Розглянемо приклад розробки базових і похідних класів в найпростішому випадку, коли оголошена ієрархія класів лише двох простих геометричних об'єктів: круга і циліндра.

Програма складена так, щоб внутрішні значення змінних г(радіус круга) і h(висота циліндра) визначали параметри створюваних об'єктів. Базовий клас Circle моделює круг, а похідний клас Cylinder моделює циліндр.

П риклад 15:

const double pi = 4 * atan(l);

class Circle //базовий клас

{

protected:

double r ;

public:

Circle (double rVal =0) {r=rVal;}//конструктор

void setRadius(double rVal) { r = rVal; }//присвоїти радіус кола

double getRadiusO { return r; } //отримати радіус кола

double Area() { return pi*r*r; }//отримати площу кола

void showData() ;//вивести на екран інформацію про коло

};

class Cylinder : public Circle

{

protected:

double h;

public:

Cylinder(double hVal = 0, double rVal = 0): Circle(rVal) {getHeight = hVal;}// конструктор

void setHeight(double hVal) { h = hVal; }//встановити висоту

//циліндра

double getHeight() { return h; }//отримати висоту циліндра

//отримати площу циліндра

double Area() { return 2*Circle::Area()+2*pi*r*h; }

void showData();// вивести на екран інформацію про циліндр

};

void Circle::showData() {

cout << "Радіус круга = " << getRadius() << endl

<< "Площа круга = " << Area () << endl << endl;

}

void Cylinder::showData()

{

cout << "Радіус основи = " << getRadius() << endl

<< "Висота циліндра = " << getHeight() << endl

<< "Площа поверхні = " << Area () << endl;

}

void main()

{

Circle circle(2) ;

Cylinder cylinder(10, 1);

circle.showData () ;

cylinder.showData() ;

}

Оголошення класу Circle містить єдиний член даних r, конструктор і ряд методів. При створенні об'єкта конструктор ініціалізує член даних r початковим значенням радіуса круга. Відзначимо новий синтаксис конструктора: при виклику він може звернутися до конструктора базового класу, а також до будь-якого члена даних, зазначеному після двокрапки. У нашому випадку член даних r "створюється" звертанням до нього з параметром rVal і ініціалізується нульовим значенням.

setRadius установлює, a getRadius повертає значення члена даних r. Метод Area повертає площу круга. Метод showData виводить на екран значення радіуса круга та площі круга.

Клас Cylinder, оголошений як похідний від Circle, містить єдиний член даних h, конструктор і ряд методів. Конструктор Cylinder явно викликає базовий конструктор для ініціалізації радіусу (конструкція – Cylinder(double hVal = 0, double rVal = 0): Circle(rVal)). Цей клас успадковує член даних r для збереження радіуса основи циліндра і функції–члени setRadius і getRadius. При створенні об'єкта конструктор ініціалізує члени даних r та h початковими значеннями. Відзначимо новий синтаксис конструктора: у нашому випадку член даних h ініціалізується значенням аргументу hVal, а член даних r - викликом конструктора базового класу Circle з аргументом rVal.

Функція setHeight установлює, a getHeight повертає значення члена даних h. Circle::Area перезавантажує успадковану функцію базового класу, щоб повертати площу поверхні циліндра. Функція showData друкує значення радіуса основи, висоти і площі поверхні циліндра.

Функція main створює круг circle класу Circle з радіусом 2 і циліндр cylinder класу Cylinder з висотою 10 і радіусом основи 1, а потім звертається до showData для друку параметрів створених об'єктів. На друк виводиться:

Радіус круга = 2 Площа круга = 12.566

Радіус основи = 1 Висота циліндра = 10 Площа поверхні = 69.115

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]