Open yanaskyrda opened 4 years ago
Віртуальні методи - це методи в базових класах, які можуть бути перевизначені в класах-наслідниках
Virtual методи базового класу можна перевизначити в підкласі , також можна використовувати pure virtual методи які необхідно перевизначити.
virtual необхідно ставити для функцій базовго класу, які нам потрібно перевизначити в в підкласі.
Віртуальна функція зі специфікатором virtual створюється у базовому класі і перевизначається у його підклассах (наслідниках). Віртуальні функції є особливими функціями, тому що при виклику об'єкта похідного класу за допомогою вказівника або посилання на нього С ++ визначає під час виконання програми, яку функцію викликати, грунтуючись на типі об'єкта. Для різних об'єктів викликаються різні версії однієї і тієї ж віртуальної функції. Віртуальна функція оголошується в базовому класі з використанням ключового слова virtual. Коли ж вона перевизначається в похідному класі, повторювати ключове слово virtual немає необхідності, хоча і в разі його повторного використання помилки не виникне.
Якщо ви хочете надати можливість перевизначити метод у підкласі необхідно зробити його віртуальним. Тоді при виконанні програми для підкласу(на який зберігається посилання у батьківському покажчику) буде працювати саме його реалізація методу
Коли ми оголошуємо функцію віртуальною, використовуючи virtual, то це рівносильно тому, як би ми зверталися до неї нена пряму, а через вказівник.
typedef void (functionPointer)(ClassA);
struct ClassA { functionPointer func1; bool called; };
void callMe(ClassA* thisA) { thisA->called = true; }
ClassA ca; ca.called = false; ca.func1 = callMe; ca.func1(&ca); // Буде викликана функція callMe().
Тому при зверненні до перекритого методу завжди буде викликана саме "остання" версія функції. Навіть якщо звертатися до неї, вказуючи клас-предок.
Virtuаl дозволяє перевизначити метод у підкласі, для цього існує спеціальна таблиця вірутальних методів. Використовують для динамічного поліморфізму, або реалізації інтерфейсів
За допомогою virtual можна створювати віртуаьні(повністю віртуальні) методи класу, які можна(необхідно) перевизначити у підкласах. virtual використовують для реалізації динамічного поліморфізму, зокрема створення абстрактних класів, щоб працювати з підкласами так само як і з базовим класом