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

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

22.12.2015, 16:40. Показов 18539. Ответов 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
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
23.12.2015, 15:49
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Fangod Посмотреть сообщение
Я вот вас почитал, и ещё больше запутался
т.е. методы переопределяются и без virtual? (если забыть про override)
Да.

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
struct A
{
  virtual void f() { cout << "A" << endl;  }
};
struct B : public A
{
   void f() { cout << "B" << endl;  }
};
 
int main()
{
   A* ptr = new B();
   ptr->f();               // Output: B
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
23.12.2015, 15:56
Цитата Сообщение от Croessmah Посмотреть сообщение
даже если писать без virtual и без override.
и без final
Croessmah, только ты забыл Y отнаследовать от Х.
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
23.12.2015, 16:10
Цитата Сообщение от Tulosba Посмотреть сообщение
Croessmah, только ты забыл Y отнаследовать от Х.
о май лысый локоть... вроде выспался, а толку от меня ноль
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
23.12.2015, 16:17
Цитата Сообщение от ct0r Посмотреть сообщение
В этом гайде кстати написано, что подразумевается сложность уровня moderate
Это в каком пункте? Я про ES.28 "Use lambdas for complex initialization, especially of const variables"
и там в комменте нечто другое сказано:
this could be some arbitrarily long code needed to initialize x
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
23.12.2015, 16:18
Зачем вообще ограничивать программистов делая свой метод final ? Если кто-то пытается унаследовать класс, то он знает что делает переопределяя поведение)
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
23.12.2015, 16:25
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
то он знает что делает переопределяя поведение
или не знает...

также с помощью final, например, можно ограничить наследование
C++
1
2
3
class X{public: virtual ~X(){}};
class Y final : public X {}; //Tulosba, я это сделал!!!
class Z : public Y {};//Error!
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
23.12.2015, 16:26
Цитата Сообщение от Fangod Посмотреть сообщение
Я вот вас почитал, и ещё больше запутался
т.е. методы переопределяются и без virtual? (если забыть про override)
Ну да, если сигнатура совпадает с одной из виртуальных функций в одном из базовых классов. Но чтобы в этом убедиться, надо просмотреть виртуальные функции во всех базовых классах, и еще уследить, не вкрались ли ошибки. Если поставить override, то компилятор будет сам это проверять, в противном случае при ошибке в сигнатуре переопределения не произойдет, хотя код скомпилируется.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
23.12.2015, 16:33
Цитата Сообщение от Croessmah Посмотреть сообщение
или не знает..
Я таких примеров незнаю. А вы? Тут цитата про маньяка, который знает где вы живете и сопровождает твой код?)) ) Когда сами себе ставят ловушку на будущее. Будем расширять возможности и сталкнёмся с тем, что не можем)))
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
23.12.2015, 16:36
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Зачем вообще ограничивать программистов делая свой метод final ?
Это нарушает инкапсуляцию.
Потому, что даже если этот метод private, в наследнике его можно переопределить. Вызвать нельзя, а переопределить можно. private - детали реализиции которые мы можем менять ни у кого не спрашивая и хорошо бы лишить других возможности их изменить не спрашивая у нас.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.12.2015, 19:20
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Зачем вообще ограничивать программистов делая свой метод final ?
бывают ситуации, когда дальнейшее переопределение вирт.
метода может нарушить логику работы
(например - фабричного метода)

в этом случае final будет очень кстати.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
23.12.2015, 19:55
Цитата Сообщение от hoggy Посмотреть сообщение
например - фабричного метода
а можно конкретнее пример?

я не понял как base* getMyTypePart() const переопределение поломает фабрику. Или темболее описание новой логики сборки используя baseFactory методы
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.12.2015, 20:51
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
а можно конкретнее пример?
представьте себе игровой модуль для казиношного слота.
разные модули - разные игрушки.
разные картинки, разная музыка, разные эффекты
разное шоу, которое они показывают игрокам.
но смысл всех игрушек один и тот же.

так что можно сказать, что они - клоны друг друга.

однако вычисления связанные с расчетами выигрышей/проигрышами игроков(деньги)
у них у всех одинковый, и зашит в базовом классе.

поэтому, делаем общую базу,
от которой наследуются модули.
основной функционал весь остается в базе,
а модули реализуют лишь мелкие детальки.

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

то бишь, на нем и слоты, и покер отыграть можно, и рулетку, и тп.

соотвественно - все через интерфейсы.

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

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

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

а так буковок мало, и все безопасно.
1
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
24.12.2015, 01:07
Цитата Сообщение от Tulosba Посмотреть сообщение
Это в каком пункте? Я про ES.28 "Use lambdas for complex initialization, especially of const variables"
и там в комменте нечто другое сказано:
В ES.22: For initializers of moderate complexity, including for const variables, consider using a lambda to express the initializer; see ES.28
Кстати я нашел вот что: http://herbsutter.com/2013/04/... -variable/
Но если взглянуть там на второй комментарий и число лайков/дизлайков (43/4), то можно убедиться, что множество народу не поддерживает такой стиль.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Зачем вообще ограничивать программистов делая свой метод final ?
Для оптимизации.
1
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
24.12.2015, 07:59
Цитата Сообщение от ct0r Посмотреть сообщение
Кстати я нашел вот что: http://herbsutter.com/2013/04/... -variable/
and a sneaky pair of parenthesis at the end - хорошо сказано!
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
24.12.2015, 14:24
Цитата Сообщение от ct0r Посмотреть сообщение
можно убедиться, что множество народу не поддерживает такой стиль.
Надо конечно рассматривать более конкретные варианты, однако замечу, что создание именованной функций не всегда удобно. Если действие происходит в функции-члене, то надо модифицировать определение класса, что менее удобно (и несет за собой в общем случае необходимость пересборки зависимых от этого модулей), чем создание и вызов лямбды с захватом необходимых переменных по месту.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
24.12.2015, 14:45
Цитата Сообщение от Tulosba Посмотреть сообщение
Если действие происходит в функции-члене, то надо модифицировать определение класса, что менее удобно (и несет за собой в общем случае необходимость пересборки зависимых от этого модулей), чем создание и вызов лямбды с захватом необходимых переменных по месту.
Опять же все зависит от конкретного случая. По умолчанию делается свободная функция в анонимном пространстве имен. А вот не думая пихать именованную функцию в private секцию - от лукавого, само собой.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
24.12.2015, 15:03
Цитата Сообщение от ct0r Посмотреть сообщение
По умолчанию делается свободная функция в анонимном пространстве имен.
Это можно, если не используются зависимые/закрытые сущности от класса, в котором всё это происходит.
А если используется, то либо friend, либо member.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.12.2015, 15:03
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
77
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru