Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/89: Рейтинг темы: голосов - 89, средняя оценка - 4.85
9 / 9 / 0
Регистрация: 07.10.2011
Сообщений: 187

Чем отличается override от virtual?

22.12.2015, 16:40. Показов 18482. Ответов 76
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Так и не понял.
Если указать метод как override, то он переопределит метод базового класса
Для этого метод базового класса должен быть virtual?
Но virtual методы и без этого переопределяются, разве не так?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.12.2015, 16:40
Ответы с готовыми решениями:

Virtual и override
Доброго времени суток, может кто обьяснить мне зачем использовать virtual и ovveride если и без них все работает: using System; ...

Зачем использовать virtual и override?
Зачем использовать virtual и override, если и без них все замечательно работает, например: class First { public virtual string ...

Зачем нужен virtual и override
Подскажите пожалуйста, вот пример №1: class Vader { public string Fok() { return...

76
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
22.12.2015, 16:50
Где Вы эту туфту вычитали?
0
9 / 9 / 0
Регистрация: 07.10.2011
Сообщений: 187
22.12.2015, 16:53  [ТС]
Знакомый сказал
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
22.12.2015, 16:54
override - обязательное переопределение. Если в базовом классе нет такого метода (ты тупо ошибся с сигнатурой) будет ошибка компиляции.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
22.12.2015, 16:57
ИМХО, это сделано, чтобы компилятор автоматически отыскивал ошибки в неправильном переопределении функций. Ты написал свой класс на основе базового, а твой коллега взял и переписал в нём ключевой переопределяемый метод. Компилятор это обнаружит сразу на этапе компиляции.
Повторяю, ИМХО.

Добавлено через 25 секунд
Цитата Сообщение от Croessmah Посмотреть сообщение
Где Вы эту туфту вычитали?
где туфта?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
22.12.2015, 17:00
Croessmah, он же в целом правильно изложил.
override означает, что выше в иерархии есть виртуальный метод и он переопределяется, а virtual этого не требует - может быть первым в иерархии.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
22.12.2015, 17:07
nmcf, то есть если не указать override, то ничего не переопределится? Ну и термин "переопределить" как-то тут не очень уместен.
Что касается virtual, то хоть укажи его, хоть нет в наследнике, в любом случае функция-член будет виртуальна в наследнике, если она таковая в базовом. имхо, вот здесь уже уместно "преопределение".

Добавлено через 2 минуты
Другими словами, override для отлова обидных ошибок, а virtual для позднего связывания.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
22.12.2015, 17:15
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну и термин "переопределить" как-то тут не очень уместен.
Как раз здесь он и уместен. override - явное указание компилятору, что этот метод переопределяет метод базового класса. Для этого в базовом классе должен быть виртуальный метод с той же сигнатурой (единственное, что вообще можно переопределить).
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
22.12.2015, 17:17
avgoor, так если оно не виртуальное, то будет ошибка и ничего не переопределится. Но без override перекроем имя.

Наверное, я не так немного выразился.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
22.12.2015, 17:18
Да. Но я про термин.
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
22.12.2015, 17:39
Croessmah, вы были правы - не ведитесь на них.!

Если указать метод как override, то он переопределит метод базового класса
Если... , то он ...

А если не указать, то что? Втык ТСу был заслужен!
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
22.12.2015, 17:46
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
А если не указать, то что?
А если не указать и ошибиться со списком параметров - то сокроет.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
22.12.2015, 17:52
не ведитесь на них
Я тоже изначально вопрос неправильно прочитал, поэтому неправильно до меня он дошел, и написал про туфту тогда. Так что втык мне тоже справедливый
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
22.12.2015, 17:55
Цитата Сообщение от Fangod Посмотреть сообщение
Так и не понял.
Если указать метод как override, то он переопределит метод базового класса
Для этого метод базового класса должен быть virtual?
Но virtual методы и без этого переопределяются, разве не так?
Ну да, но так вы только сигнатурой намекаете, что хотите переопределить, но в сигнатуре можно ошибиться, и компилятор о ваших намерениях не догадается, код скомпилируется, но вместо переопределения произойдет сокрытие.
Если применить override, то сокрытия не произойдет никогда, - только переопределение или ошибка компиляции.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.12.2015, 18:50
Лучший ответ Сообщение было отмечено rikimaru2013 как решение

Решение

Цитата Сообщение от Fangod Посмотреть сообщение
Но virtual методы и без этого переопределяются, разве не так?
верно.


ключевое слово override используется
для дополнительной подстраховки от ошибок.

оно означает, что метод обязательно должен переопределить
метод базового класса.


если его не указать, то технически можно и не переопределить ничего.
например, в наследнике можно реализовать метод с таким же именем,
но с альтернативной сигнатурой,
который тупо скроет метод базового класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
 
 
struct example
{
    virtual void foo(int)const ;
};
 
struct bar: example
{
    //--- наследник обязуется переопределять метод базового класса
    virtual void foo(int)const override  {} 
};
 
struct baz: example
{
    //--- наследник не обязан переопределять метод базового класса
    // и может создать метод с таким же именем
    // но с другими аргументами.
    // что приведет к сокрытию метода базового класса
    virtual void foo(char)const  {} 
};
 
 
struct daz: example
{
    //--- расскоментируйте эту строку
    // что бы увидеть компал-тайм защиту в действии
    //virtual void foo(char)const override  {} 
};
 
 
 
 
int main()
{
    std::cout << "Hello, world!\n";
}
Добавлено через 10 минут
Цитата Сообщение от Mr.X Посмотреть сообщение
Если применить override, то сокрытия не произойдет никогда, - только переопределение или ошибка компиляции.
одноименные функции-члены наследников
всегда скрывают функции-члены базовых классов,
за исключением случая,
когда область видимости функций-членов базового класса,
явным образом расширена до пространства имени наследника:

http://rextester.com/BUHNS61944


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
 
struct base
{
    virtual void foo(int)const { std::cout<<"base::foo(int)\n"; } ;
};
 
struct bar: base
{ 
    virtual void foo(int)const override  { std::cout<<"bar::foo(int)\n"; } ;
};
 
struct baz: base
{
    // расширяем область видимости базовых функций-членов
    // в имени наследника
    using base::foo;
    
    virtual void foo(char)const  { std::cout<<"bar::foo(char)\n"; } ;
};
 
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    bar obj1; 
    
    obj1.foo(10);
    
    //функция-член базы оказалось скрытой
    obj1.base::foo(20);
    
    
    baz obj2;
    
    obj2.foo('t');
    
    // не скрыта, потому что область видимости
    // явным образом была распространена 
    // на пространство имени наследника
    obj2.foo(10);
    
}

одна из распространенных новичковых ошибок:
они думают, что наследник переопредяя метод,
изменяет логику метода базового класса.

на самом деле термин "переопределение" довольно тупорый, и сбивает с толку.
потому что на самом деле никакого переопределения существующих функций-членов не происходит.
наследники лишь добавляют свои собственные со своей собственной логикой,
которые скрывают функции-члены базы, и участвуют в полиморфизме.

однако, по факту,
все функции-члены всех классов иерархии наследования
сосуществуют одновременно,
и при желании до скрытых методов предков можно дотянуться.
3
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.12.2015, 19:00
Добавлю на счет стиля. Писать одновременно и virtual, и override для одной и той же функции, многие считают избыточным. И я в том числе. Т.к. наличие override подразумевает, что функция уже является виртуальной.
Аналогично для final. Хотя фактически можно сделать виртуальную функцию непереопределяемой (final) в самом верхнем базовом классе. И тогда писать virtual нужно явно.
Но какого-либо разумного объяснения для существования такой функции что-то в голову не приходит.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
22.12.2015, 19:02
Цитата Сообщение от Tulosba Посмотреть сообщение
Добавлю на счет стиля. Писать одновременно и virtual, и override для одной и той же функции, многие считают избыточным. И я в том числе.
где тут кнопка заминовать пост до потери пульса ?!!?!
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
22.12.2015, 19:13
Чем отличается override от virtual:
C++
1
2
3
4
int main() {
    const int virtual = 5; // Error
    const int override = 1; // Ok
}
1
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
22.12.2015, 19:15
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
где тут кнопка заминовать пост до потери пульса ?!!?!
Наверное имеется ввиду это:
C++
1
2
3
class A: puplic B {
virtual void foo() override;
};
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
22.12.2015, 19:23
Цитата Сообщение от ct0r Посмотреть сообщение
const int override = 1; // Ok
Обратная совместимость с кодом, что уже написан и там могли использоваться такие переменные?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.12.2015, 19:23
Помогаю со студенческими работами здесь

Обязательно ли описывать функцию с override, если в базовом классе уже есть метод с virtual?
Здравствуйте, хотел узнать обязательно ли описывать функцию с override если к примеру в базовом классе уже есть метод с virtual? Ведь без...

В чем разница между new и override?
разница между new и override?

В чем разница между new и override?
Цитирую с msdn: Для чего нужно вообще использовать new? поведение методов одно и то же что и при override. Или мой код слишком...

В чем различие применение модификатора override и new?
Добрый день ! Подскажите в чем различие применение модификатора override и new ? virtual String ^ToString() new; virtual...

Чем отличается =- от -=
Только подробно опишите пожалуйста,у меня из-за этого программа в циклах не правильно считает


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru