kzhereb / knu-is-ooop2019

Materials for "Fundamentals of OOP" course
MIT License
3 stars 0 forks source link

T10.55. Що таке virtual? Де його треба ставити? #55

Open yanaskyrda opened 4 years ago

i1red commented 4 years ago

За допомогою virtual можна створювати віртуаьні(повністю віртуальні) методи класу, які можна(необхідно) перевизначити у підкласах. virtual використовують для реалізації динамічного поліморфізму, зокрема створення абстрактних класів, щоб працювати з підкласами так само як і з базовим класом

solovdaria commented 4 years ago

Віртуальні методи - це методи в базових класах, які можуть бути перевизначені в класах-наслідниках

AntonHladkiy commented 4 years ago

Virtual методи базового класу можна перевизначити в підкласі , також можна використовувати pure virtual методи які необхідно перевизначити.

RostyslavMV commented 4 years ago

virtual необхідно ставити для функцій базовго класу, які нам потрібно перевизначити в в підкласі.

MarinaMontag commented 4 years ago

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

i1red commented 4 years ago

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

tanyakurdelchuk commented 4 years ago

Коли ми оголошуємо функцію віртуальною, використовуючи 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().

Тому при зверненні до перекритого методу завжди буде викликана саме "остання" версія функції. Навіть якщо звертатися до неї, вказуючи клас-предок.

ilyakorenevskyi commented 4 years ago

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