Тема 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() через покажчик на базовий клас
Отже, завдяки використанню віртуальних функцій і поліморфізму, один і той же виклик функції може привести до різних дій залежно від типу об'єкта, що приймає цей виклик.
Запитання для самоконтролю