Лекція "Поліморфізм"

Про матеріал
Тема 5. Поліморфізм Зміст теми. Перевантаження функцій. Віртуальні функції. Віртуальні конструктори і деструктори. Поліморфізм.
Перегляд файлу

Тема 5. Поліморфізм

Зміст теми. Перевантаження функцій. Віртуальні функції. Віртуальні конструктори і деструктори. Поліморфізм.

 

 

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

Наприклад:

class А

{   

    . . .  

public:

   void draw();

}  

 

class В: public А  

{

. . .

   void draw();  // перевизначення методу draw() базового класу

 

};

void draw();

{

    class А:: draw(); //виклик функції draw() базового класу А

. . .

}

Поліморфізм – можливість для об'єктів різних класів, пов'язаних за допомогою спадкування, реагувати різним чином при звертанні до однієї і тієї ж функції-елемента. Поліморфізм реалізується за допомогою віртуальних функцій, тобто при оголошенні функції у класі використовується ключове слово virtual, наприклад:

virtual void draw();

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

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

Приклад виклику функції draw() через покажчик на базовий клас:

В  b;   // оголошення об’єкта похідного класу з ім’ям  b  

А *pА;  // оголошення  покажчика pА на базовий клас А

pА =& b;  // покажчику привласнюється адреса об'єкта b

pА-> draw ();      // виклик функції draw() через покажчик на базовий клас

Отже, завдяки використанню віртуальних функцій і поліморфізму, один і той же виклик функції може привести до різних дій залежно від типу об'єкта, що приймає цей виклик.

 

Запитання для самоконтролю

 

  1. Дайте визначення перевантаження функцій.
  2. Що означає поліморфізм?
  3. За допомогою чого реалізується поліморфізм?
  4. Чи можна покажчику на базовий клас присвоїти значення адреси об'єкта похідного класу?
  5. Що необхідно для того, щоб реалізувати поліморфізм в програмі?


 

docx
Додано
14 квітня 2020
Переглядів
649
Оцінка розробки
Відгуки відсутні
Безкоштовний сертифікат
про публікацію авторської розробки
Щоб отримати, додайте розробку

Додати розробку