Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
 Аватар для SkYMaaN
25 / 19 / 9
Регистрация: 05.04.2019
Сообщений: 338

Зачем нужны виртуальные функции если есть перегрузка?

14.09.2020, 20:52. Показов 6574. Ответов 53

Студворк — интернет-сервис помощи студентам
Есть следующий код:
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
#include <iostream>
using std::cout;
using std::endl;
class Gun
{
public:
    virtual void shoot()
    {
        cout << "Выстрел!" << endl;
    }
};
class SubmachineGun : public Gun
{
public:
    void shoot() override
    {
        cout << "Выстрел! Выстрел! Выстрел! Выстрел!" << endl;
    }
};
 
int main()
{
    setlocale(LC_ALL, "");
    Gun obj; obj.shoot();
    SubmachineGun obj1; obj1.shoot();
}
Если убрать наследования и ключевые слова override and virtual - результат функций не меняется, каждая выполняет свою реализацию.
В чём тогда преимущество виртуальных функций перед следующим кодом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Gun
{
public:
    void shoot()
    {
        cout << "Выстрел!" << endl;
    }
};
class SubmachineGun
{
public:
    void shoot()
    {
        cout << "Выстрел! Выстрел! Выстрел! Выстрел!" << endl;
    }
};
Или даже перед таким кодом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Gun
{
public:
    void shoot()
    {
        cout << "Выстрел!" << endl;
    }
};
class SubmachineGun
{
public:
    void shoot(int count)
    {
        for (size_t i = 0; i < count; i++)
        {
            cout << " Выстрел!";
        }
    }
};
Прошу не бить меня палками, просто пытаюсь понять.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.09.2020, 20:52
Ответы с готовыми решениями:

Зачем нужны массивы, если есть обычные переменные?
Здравствуйте. У меня есть вопрос. Зачем нужны массивы, если есть обычные переменные? Можно ведь написать не так: int a= {6,5}; а так:...

Зачем нужны обычные массивы, если есть динамические?
Всем привет! Вопрос в заголовке. Если динамический массив даёт те же и ещё больше функций и, при том, лучше обращается с памятью, зачем...

Зачем нужны виртуальные методы?
Тут она не виртуальная Student s; Person &amp;p = s; s.name(); //Student::name() p.name(); //Person::name() А тут наоборот ...

53
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
17.09.2020, 20:31
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от JeyCi Посмотреть сообщение
вообще, я, конечно, не экстрасенс...
Да уж конечно... Виртуальность тут где? И при чём тут basic_ostream в контексте предложенных классов? Что сказать хотите?
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
17.09.2020, 21:46
что есть вариант и с ними (virtual и override) - см. пост#2:
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
#include <iostream>
 
class A
{
    public:
        virtual std::ostream &Format(std::ostream &out) const { return out << "A !!!!";}
        
};
 
class B : public A
{
    public:
        std::ostream &Format(std::ostream &out) const override  { return out << "B !!!!";}
};
 
int main()
{
    A* a=new B;
    B* b=new B;
    a->Format(std::cout)<< std::endl;
    b->Format(std::cout)<< std::endl;
    A aa;
    B bb;
    aa.Format(std::cout)<< std::endl;
    bb.Format(std::cout)<< std::endl;   
}
- без них др. вывод будет при использовании динамической памяти...

Добавлено через 3 минуты
вот и вернулись к вопросу ТСа...
подкрепившись вариантом с template'ом (см. ранее)...
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
17.09.2020, 21:51
Цитата Сообщение от JeyCi Посмотреть сообщение
вот и вернулись к вопросу ТСа...
Без использования указателя на базовый (который может быть установлен то на один, то на другой член иерархии по данной ветке наследования) фокус не получится. Тут нет разницы динамическая память или нет. Это мы вернулись к первым страницам, да. И можем ещё долго кружить.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
17.09.2020, 21:56
к вопросу, что будет С и БЕЗ
Цитата Сообщение от JeyCi Посмотреть сообщение
virtual и override
(я же не буду дублировать последний код "без" - ... а разница в результате есть )
... только деструктор пока не очень получается изобразить для последнего кода...
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
17.09.2020, 22:00
Цитата Сообщение от JeyCi Посмотреть сообщение
... только деструктор пока не очень получается изобразить для последнего кода...
C++
1
2
3
4
5
6
7
class A
{
public:
    virtual  ~A() = default;
    virtual std::ostream &Format(std::ostream &out) const { return out << "A !!!!";}
        
};
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
17.09.2020, 22:01
Цитата Сообщение от IGPIGP Посмотреть сообщение
Без использования указателя на базовый... Тут нет разницы динамическая память или нет.
а как вы на стеке указателю на базовый назначите производный?.. у меня такое не работает...
0
17.09.2020, 22:02

Не по теме:

Цитата Сообщение от JeyCi Посмотреть сообщение
к вопросу, что будет С и БЕЗ
это не вопрос темы. override -подсказка компилятору. Тут целый пласт внутри виртуальности. Оно не дружит с перегрузкой так, что мама не горюй и стреляет по ногам дуплетом.
JeyCi, для такого новая тема нужна. Начать с нуля и поднять. Название данной будут (и уже гуглят) куча народу. К моменту вашего вхождения (когда кашалоты и ТС разбежались в разные стороны), уже было больше 1 килопросмотра. Представляете, что будут люди думать про различных (не будем показывать пальцами) участников темы, когда для ответа на вопрос заголовка им придётся читать кучу стеков динамической информации?

0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
17.09.2020, 22:03
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
virtual ~A() = default;
ой не то удаляла... спасибо
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
18.09.2020, 09:55
Цитата Сообщение от JeyCi Посмотреть сообщение
а как вы на стеке указателю на базовый назначите производный?
Указатель
C++
1
2
Derived derived;
Base * base = &derived;
Ссылка
C++
1
2
Derived derived;
Base & base = derived;
Или даже так:
C++
1
Base && base = Derived();
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
18.09.2020, 11:16
DrOffset, на первой странице вопрос задавался и был ответ
Зачем нужны виртуальные функции если есть перегрузка?
Может вам повезет больше.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
26.09.2020, 15:05
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Вопрос организации иерархии/взаимодействия классов и объектов, он довольно сложный и сильно зависит от предметной области и постановки задачи. Можно сделать по-разному, но как-то здравый смысл не стоит отключать.
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Шаблоны - это compile-time. Виртуальные методы - это runtime + накладные расходы
Размещение объектов. Часть 2: Виртуальность
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
13.10.2020, 07:14
но с Шаблонами есть интересный момент
Проблемы возникают тогда, когда с использованием шаблонов начинают писать код, который порождает другой код, т.е. писать код на языке шаблонов — это называется метапрограммирование. Многие люди, увидев подобный код, впадают в состояние транса — тут ещё хуже чем с указателями, если указатели не все понимают, то с шаблонами дело обстоит ещё хуже. Оно и не мудрено — код с большим количеством шаблонов практически нечитаем. Не думайте, что есть какие-то супер гуру, которые его легко читают — нет. Пока ты пишешь такой код, его читать не очень сложно, а вот после того, как его написал и вернулся через месяц-другой, приходится его распутывать по новой. Именно поэтому, код с большим количеством шаблонов, раньше, как правило, находился только в библиотеках, которые писали профессионалы
Добавлено через 3 минуты
а виртуальность вижу полезной здесь:
Разработка интерфейсных классов на С++
...
думаю, в простых случаях и перегрузкой можно обойтись... имхо
0
13.10.2020, 10:01

Не по теме:

Цитата Сообщение от JeyCi Посмотреть сообщение
в простых случаях и перегрузкой можно обойтись...
в простых случаях и без перегрузки можно.

0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.10.2020, 10:19
Цитата Сообщение от JeyCi Посмотреть сообщение
Многие люди, увидев подобный код, впадают в состояние транса — тут ещё хуже чем с указателями, если указатели не все понимают, то с шаблонами дело обстоит ещё хуже. Оно и не мудрено — код с большим количеством шаблонов практически нечитаем. Не думайте, что есть какие-то супер гуру, которые его легко читают — нет.
Всё нормально он читается. Зачастую, даже лучше, чем код без шаблонов. Не стоит здесь ориентироваться на людей, для которых указатели уже проблема.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.10.2020, 10:19

зачем нужны анонимус-функции? если есть {} и let
Часто вижу подобные куски кода ( function() { ... var a = 5; /// })(); undefined a VM186:1 Uncaught ReferenceError: a...

Зачем нужны модули, если есть пространства имён?
Зачем нужны модули, если есть пространства имён?

Зачем нужны наборы в Evernote, если есть Блокноты?
Зачем нужны наборы в Evernote, если есть Блокноты?

А зачем нужны веб программисты, если есть wordpress?
Открыл я сайт с вакансиями, а там написано &quot;требуется программист php, зарплата 90 тыс в месяц&quot;. Звоню спрашиваю, что вы пишете..они...

Зачем нужны rvalue ссылки, если есть универсальные ссылки
Читаю книгу Скотта Мэйерса... Что-то я совсем запутался с этими rvalue ссылками. Я не пойму, зачем нужны rvalue ссылки, если есть...


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

Или воспользуйтесь поиском по форуму:
54
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru