Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекції ООП1.doc
Скачиваний:
5
Добавлен:
17.11.2019
Размер:
553.98 Кб
Скачать

1. Поліморфізм

Здатність вирішувати на етапі виконання, яку саме з декількох перенавантажених функцій залежно від поточного типа слід викликати, називається поліморфізмом або пізнім зв'язуванням. Термін поліморфізм походить від двох грецьких коренів — полі (тобто різноманіття) і морф (форма), доповнений широко відомим греко-латинським суфіксом изм. С++ підтримує поліморфізм. Щоб підкреслити протилежність пізньому зв'язуванню, вибір перевантаженої функції на етапі компіляції називають раннім зв'язуванням.

Поліморфізм і пізнє зв'язування — не зовсім еквівалентні терміни. Поліморфізм означає здатність вибору з можливих варіантів на етапі виконання, тоді як пізнє зв'язування — це всього лише механізм, який використовується мовою С++ для здійснення поліморфізму. Різниця тут досить тонка.

Навіщо, потрібен поліморфізм

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

Мови, які підтримують класи, але не підтримують поліморфізм, називаються об'єктно-основаними. До таких мов відноситься, наприклад, Аda. Без поліморфізму від наслідування було б мало толку.

Щоб зробити функцію-члена поліморфної, програміст на С++ повинен помістити перед нею ключове слово virtual так, як це показано нижче.

#include <iostream.h>

class Base

{

public:

virtual void fn ( )

{

cout << “Ми в класі Base\n”;

}

};

class Subclass: public Base

{

public:

virtual void fn ( )

{

cout << “Ми в класі SubClass\n”;

}

};

void test (Base b)

}

b.fn ( ); // Використовуємо пізнє звязування

}

int main ( )

{

Base be;

Subclass sc;

cout << “Викликаємо функцію test(be)\n”;

test (be);

cout << “Викликаємо функцію test(sc)\n”;

test(sc);

return 0;

}

Ключове слово virtual повідомляє С++ про те, що fn( ) є поліморфною функцією-членом. Це так зване віртуальне оголошення fn( ) означає, що її виклики будуть зв'язані пізніше, якщо є хоч якісь сумніви з приводу типу аргументу, з яким викликатиметься функція fn( ) на етапі виконання.

У приведеному фрагменті fn( ) викликається через проміжну функцію test( ). Коли функції test( ) передається об'єкт базового класу, b.fn( ) викликає функцію Base::fn( ). Але коли функції test( ) передається об'єкт класу Subclass, цей же виклик звертається до функції Subclass::fn( ).

Запуск програми приведе до висновку на екран таких рядків:

Викликаємо функцію test(be) Ми в класі Base Викликаємо функціюtest(sc) Ми в класі Subclass

Заняття №9

Тема: Інтерпретація об'єктів (заняття 2)

Мета: Освоїти поняття наслідування властивостей та функцій -

шаблонів. План заняття:

  1. Наслідування властивостей.

  2. Визначення „накладенням" - шаблони функцій, шаблони класів.

Наслідування властивостей.

Найважливішою властивістю ООП є наслідування.

Наприклад, є клас з певними властивостями. В цілому він нас влаштовує, але необхідно додати деяку функціональність.

Можна створити новий клас на основі того, що існує через наслідування.

Наслідування - один з основоположних принципів об'єктно-орієнтованого програмування. Під наслідуванням розуміють можливість оголошення похідних типів на основі раніше оголошених типів.

Початковий клас називають предок/родитель/базовий класс/parent, а новий клас - наслідник/потомок/derived/child.

Похідний клас володіє всіма властивостями і методами предка (він їх успадкував), плюс додаються нові.

Далі, похідний клас може бути базовим для інших класів.

Так будується ієрархія класів - важливе поняття ООП.

У С++ кількість безпосередніх "предків" похідного класу не обмежена. При необхідності в похідному класі можна перекрити (перевизначити) властивості і методи базового класу.

Форма запису заголовка похідного класу:

class <ім'я нащадка > : <режим доступу > <ім'я базового класу > {<.>}

Режими доступу: зовнішнє, захищене і внутрішнє наслідування

Ці ж режими доступу - public, private і protected- використовуються при описі заголовка успадкованого класу перед ім'ям базового класу:

class <ім'я нащадка >: <public|private|protected> < ім'я базового класу >

{

// задається один з режимів

};

Режим доступу public - зовнішнє наслідування - інтерфейс базового класу (розділ public) стає зовнішнім інтерфейсом похідного класу (застосовується найчастіше).

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

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

class А

{ };

class В : public А // клас В успадковує класу А, клас В виведений з А

{

//реалізація В, що розширює можливості А

}

Наслідування - це загальноприйнята концепція. Я - людина. І я

наслідую деякі властивості класу Людина, наприклад можливість говорити, необхідність в повітрі, воді, харчуванні, я маю ім'я, вік і.т.д. Ці властивості не є унікальними для кожної окремої людини.

Ієрархія класів

Учень

Студент

Аспірант

В об'єктно – орієнтованому програмуванні такий наслідувальний зв'язок виражається в можливості одного класу наслідувати інший. В С++ один клас може наслідувати інший наступним чином:

class Student

{

public:

char name;

float serball( );

};

class Aspirant: public Student

{

public:

char dodpred;

};

В цьому прикладі Aspirant наслідує усі члени класу Student. Таким чином Aspirant ЯВЛЯЄТЬСЯ студентом. Звичайно при цьому Aspirant може містити унікальні, властиві лише йому члени.

Властивість наслідування транзитивна. Наприклад, якщо Student наслідує клас Людина, а Aspirant є підкласом класу Student, то Aspirant ЯВЛЯЄТЬСЯ Людиною.

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