Наскільки я розумію, введення override
ключового слова в C ++ 11 є не більше ніж перевірка , щоб переконатися , що функція реалізується є override
ІНГ з virtual
функції в базовому класі.
Це все?
Наскільки я розумію, введення override
ключового слова в C ++ 11 є не більше ніж перевірка , щоб переконатися , що функція реалізується є override
ІНГ з virtual
функції в базовому класі.
Це все?
Відповіді:
Це справді ідея. Справа в тому, що ви чітко розумієте, що ви маєте на увазі, щоб інакше мовчати помилку:
struct Base
{
virtual int foo() const;
};
struct Derived : Base
{
virtual int foo() // whoops!
{
// ...
}
};
Наведений вище код складається, але це не те, що ви могли мати на увазі (відзначте відсутні const
). Якщо ви сказали замість цього, virtual int foo() override
то ви отримаєте помилку компілятора, що ваша функція насправді нічим не перекриває.
override
функція "виправляє" це; Ви повинні пам’ятати, щоб ним користуватися, так само, як ви повинні пам’ятати, що писали const
;)
explicit
визначення класу не перетворили його на C ++ 11. Ага.
explicit
визначення класу? Ніколи про це взагалі не чула.
override
коли хтось має намір це зробити) скоріше, ніж запам'ятовувати кутові випадки, тобто немає загальності в копіюванні функцій різних прототипів, лише нерівності, такі як відсутні, const
або char
замість написання int
тощо.
override
у цій відповіді згадується найкращий випадок використання специфікатора , який є більш футуристичним, ніж безпосереднім. Відповідь передбачає , що, зберегти override
з virtual
методом. Надалі, коли хтось помилково змінює підпис, його корисність починає.
Цитата у Вікіпедії:
Спеціальний ідентифікатор переопределення означає, що компілятор перевірить базовий клас (и), щоб побачити, чи існує віртуальна функція з такою точною підписом. А якщо цього немає, компілятор помилиться.
http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final
Редагувати (намагаючись трохи покращити відповідь):
Оголошення методу "переосмислення" означає, що цей метод призначений для перезапису (віртуального) методу на базовий клас. Метод переосмислення повинен мати такий самий підпис (принаймні для вхідних параметрів), як метод, який він має намір переписати.
Чому це потрібно? Ну, запобігаються наступні два поширених випадки помилок:
один вводить тип у новому методі. Компілятор, не знаючи, що має намір написати попередній метод, просто додає його до класу як новий метод. Проблема в тому, що старий метод все ще є, новий додається просто як перевантаження. У цьому випадку всі виклики до старого методу будуть функціонувати так само, як і раніше, без будь-яких змін у поведінці (що було б самою метою переписування).
можна забути оголосити метод у надкласі як "віртуальний", але все ж намагається переписати його в підклас. Хоча це буде, очевидно, прийнято, поведінка не буде точно так, як задумано: метод не є віртуальним, тому доступ через покажчики на надклас закінчується викликом старого (надкласового) методу замість нового (підкласу) методу.
Додавання "переопрацювання" очевидно роз'єднує це: через це, потрібно сказати компілятору, що три речі очікують:
Якщо будь-яке з них невірно, то сигналізується про помилку.
* Примітка: вихідний параметр іноді відрізняється, але пов'язаний тип. Читайте про коваріантні та противаріантні перетворення, якщо вас цікавить.
Знайдено " переосмислити " корисно, коли хтось оновив підпис віртуального методу базового класу, наприклад додавання необов'язкового параметра, але забув оновити підпис методу отриманого класу. У цьому випадку методи між базовим та похідним класом вже не є поліморфним відношенням. Без декларації про переоцінку важко з’ясувати подібний помилку.
override
це чудовий спосіб виявити подібні проблеми, гарне покриття тестових одиниць також повинно допомогти.
Так, це так. Це перевірка, щоб переконатись, що хтось не намагається переосмислити та зіпсувати це через підписаний підпис. Ось сторінка Wiki, яка детально пояснює це і має короткий ілюстративний приклад:
http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final
C ++ 17 стандартних чернеток
Після override
перегляду всіх звернень до стандартної чернетки C ++ 17 N4659 я можу знайти єдиний посилання на override
ідентифікатор:
5 Якщо віртуальна функція позначена перевизначенням специфікатора virt і не перекриває функцію-член базового класу, програма неправильно формується. [Приклад:
struct B { virtual void f(int); }; struct D : B { virtual void f(long) override; // error: wrong signature overriding B::f virtual void f(int) override; // OK }
- кінцевий приклад]
тож я думаю, що можливий вибух неправильних програм - насправді єдиний ефект.