Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Приклад. Успадкування – це спосіб повторного використання програмного коду, при якому нові класи створюються на основі вже існуючих шляхом доповнення їх можливостями




Вступ

Успадкування – це спосіб повторного використання програмного коду, при якому нові класи створюються на основі вже існуючих шляхом доповнення їх можливостями нових класів.

При створенні нового класу замість написання повністю нових властивостей і методів програміст може вказати, що новий клас може успадковувати властивості і методи існуючого класу. Цей існуючий клас називається базовим або батьківським класом, а новий клас – похідним класом, або класом- нащадком.

Мова С++ підтримує як просте, так і множинне успадкування. При простому успадкуванні похідний клас створюється на основі одного базового класу. При множинному успадкуванні похідний клас створюється на основі декількох базових класів.

2. Реалізація простого успадкування

Протокол успадкування в С++ має наступний вигляд:

 

class <Назва похідного класу>: <кваліфікатор> <Назва базового класу>

{

...

};

 

Поле “кваліфікатор” забезпечує три типи успадкування: public (відкрите), protected (захищене) і private (закрите).

При відкритому успадкуванні властивості і методи базового класу зберігають рівень прав доступу відповідно до кваліфікаторів, з якими вони були оголошені.

При захищеному успадкуванні приватні елементи базового класу залишаються приватними в похідному класі, а відкриті стають захищеними.

При закритому успадкуванні всі елементи базового класу стають приватними в похідному класі.

Найчастіше використовується відкрите (public) успадкування.

3. Використання конструкторів і деструкторів у ланцюгах успадкування

При створенні об’єкта похідного класу виклик конструкторів здійснюється послідовно від конструктора базового класу до конструктора похідного класу, який замикає ланцюг. Кожен конструктор при цьому ініціалізує дані власного класу.

Конструктор похідного класу може викликати конструктор базового класу явно або неявно.

Коли об’єкт похідного класу знищується, деструктори викликаються у порядку, зворотньому до виклику конструкторів.

 

Приклад:

 

// батьківський клас

class AbstractForm

{

int x, y;

protected:

int color;

public:

AbstractForm ();

AbstractForm (int, int, int);

void SetX (int x) { this ->x = x;}

void SetY (int y) { this ->y = y;}

...

};

// конструктор за замовчуванням базового класу

AbstractForm::AbstractForm ()

{

x = y = 0;

color = 0;

}

// конструктор ініціалізації базового класу

AbstractForm::AbstractForm (int x, int y, int color)

{

this ->x = x;

this ->y = y;

this ->color = color;

}

// відкрите успадкування:

// клас Rectangle доповнює клас AbstractForm

// новими властивостями і методами

class Rectangle: public AbstractForm

{

int w, h;

public:

Rectangle ();

Rectangle (int, int, int, int, int);

void SetPosition (int, int);

void SetColor (int);

void SetSize (int, int);

...

};

// конструктор за замовчуванням похідного класу

Rectangle::Rectangle ()

// здіснює явний виклик конструктора за замовчуванням базового класу

: AbstractForm ()

{

w = h = 0;

}

// конструктор ініціалізації похідного класу

Rectangle::Rectangle (int x, int y, int w, int h, int color)

// здіснює явний виклик конструктора ініціалізації базового класу

// і передає йому відповідну частину своїх аргументів

: AbstractForm (x, y, color)

{

this ->w = w;

this ->h = h;

}

void Rectangle::SetPosition (int x, int y)

{

// this->x = x; – так не можна: x є приватним в базовому класі

// this->y = y; – так не можна: y є приватним в базовому класі

SetX (x); // Ok – використано відкритий метод доступу базового класу

SetY (y); // Ok – використано відкритий метод доступу базового класу

}

void Rectangle::SetColor (int c)

{

color = c; // Ok – color є захищеним у базовому класі

}

void Rectangle::SetSize (int w, int h)

{

this ->w = w;

this ->h = h;

}

 

Методичні вказівки

Завданням даної лабораторної роботи є створення, компіляція, відладка та виконання програми, в якій реалізується і тестується певна ієрархія успадкування класів. Результатом виконання лабораторної роботи має бути демонстрація коректної логіки функціонування методів похідного класу в програмі.

Для кожного створюваного класу в ієрархії необхідно реалізувати конструктор за замовчуванням, конструктори ініціалізації та копіювання.

 

 

Реалізувати базовий клас “Птах” з наступними властивостями: розмах крил, швидкість руху, висота польоту та методами, які дозволяють тримувати доступ до них. На основі даного класу утворити два похідних класи: “Горобець” та “Страус”. Клас “Горобець” доповнити масою. Клас “Страус”доповнити довжиною шиї. В обох класах реалізувати метод польоту. У кожному класі реалізувати конструктор за замовчуванням та конструктор ініціалізації.

Розв’язання:

 

// базовий клас – “Птах”

class Bird

{

float Wingspan;

float FlyHeight;

protected:

void LiftUp (float);

public:

Bird ();

Bird (float);

void SetWingspan (float);

float GetWingspan () { return Wingspan;}

float GetFlyHeight () { return FlyHeight;}

};

Bird::Bird ()

{

Wingspan = FlyHeight = 0;

}

Bird::Bird (float Wingspan)

{

SetWingspan (Wingspan);

FlyHeight = 0;

}

void Bird::SetWingspan (float Wingspan)

{

this ->Wingspan = (Wingspan > 0)? Wingspan: 0;

}

void Bird::LiftUp (float FlyHeight)

{

this ->FlyHeight = (FlyHeight >= 0)? FlyHeight: 0;

}

// похідний клас – “Горобець”

class Sparrow: public Bird

{

float Weight;

public:

Sparrow ();

Sparrow (float, float);

void SetWeight (float);

float GetWeight () { return Weight;}

void Fly ();

};

Sparrow::Sparrow ()

: Bird ()

{

Weight = 0;

}

Sparrow::Sparrow (float Wingspan, float Weight)

: Bird (Wingspan)

{

SetWeight (Weight);

}

void Sparrow::SetWeight (float Weight)

{

this ->Weight = (Weight > 0)? Weight: 0;

}

void Sparrow::Fly ()

{

LiftUp (10);

}

// похідний клас – “Страус”

class Ostrich: public Bird

{

float NeckLength;

public:

Ostrich ();

Ostrich (float, float);

void SetNeckLength (float);

float GetNeckLength () { return NeckLength;}

void Fly ();

};

Ostrich::Ostrich ()

: Bird ()

{

NeckLength = 0;

}

Ostrich::Ostrich(float Wingspan, float NeckLength)

: Bird (Wingspan)

{

SetNeckLength (NeckLength);

}

void Ostrich::SetNeckLength (float NeckLength)

{

this ->NeckLength = (NeckLength > 0)? NeckLength: 0;

}

void Ostrich::Fly ()

{

LiftUp (0.5);

}

#include <conio.h>

#include <iostream.h>

// тестова програма

void main ()

{

Sparrow Chirik;

Ostrich Nandu;

 

Chirik.SetWeight (150);

Nandu.SetNeckLength (50);

Chirik.SetWingspan (12.5);

Nandu.SetWingspan (150);

clrscr ();

cout << "Weight of sparrow: " << Chirik.GetWeight() << " g" << endl;

cout << "Length of neck of ostrich: " << Nandu.GetNeckLength() << " sm" << endl;

cout << "Wingspan of sparrow: " << Chirik.GetWingspan () / 10 << " m" << endl;

cout << "Wingspan of neck of ostrich: " << Nandu.GetWingspan () / 10 << " m" << endl;

Chirik.Fly ();

Nandu.Fly ();

cout << "Height of fly of sparrow: " << Chirik.GetFlyHeight () << " m" << endl;

cout << "Height of fly of neck of ostrich: " << Nandu.GetFlyHeight () << " m" << endl;

getch ();

}

 




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


Дата добавления: 2015-06-27; Просмотров: 1814; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.033 сек.