170 похожих чатов

Тебе непонятно зачем нужен дин. полиморфизм?

7 ответов

31 просмотр

Мне понятно когда нужен полиморфизм, но тут поведение зависит от указателей, а я не очень поинмаю когда это применяется. Если я использую MyExtendedClass унаследованный от BaseClass, то я не встречусь с указателем на базовый класс соответственно и virtual не будет нужен.

Kirill-Bolshakov Автор вопроса
Nastya Medveda
Мне понятно когда нужен полиморфизм, но тут поведе...

Если ты не юзаешь наследника через указатель на базу, то и virtual тут не нужен, естественно)

Kirill Bolshakov
Если ты не юзаешь наследника через указатель на ба...

А когда нужен? Когда я в уже существующем коде заменяю какой-то один базовый класс своим и все остальные части этой программы получают по ссылке вместо базового класса мой новый и пытаются работать с ним как со старым?

Kirill-Bolshakov Автор вопроса
Nastya Medveda
А когда нужен? Когда я в уже существующем коде зам...

Не со старым, а по контракту базового класса.

Nastya Medveda
Мне понятно когда нужен полиморфизм, но тут поведе...

Например, у тебя есть вектор указателей на базовый класс, к которой ты хочешь применить один и тот же метод в цикле, но при этом тебя не очень волнует, какие конкретно сущности там представлены. Для наглядности, пусть у тебя будет базовый класс Employee - сотрудник фирмы. От него унаследуются Manager, Programmer, ... . Допустим, ты хочешь, чтобы у каждого сотрудника вызвался метод индексация зарплаты. Примерно так это будет выглядеть. Ты изначально проектируешь иерархию наследования с целью добиться одинакового интерфейса у схожих сущностей. class Employee { virtual void RaiseSalary() { /// some logic } }; class Manager : public Employee { virtual void RaiseSalary() override { /// немного отличная логика, например, повышение с коэффициентом } }; class Programmer : public Employee { virtual void RaiseSalary() override { /// немного отличная логика, например, повышение с коэффициентом } }; std::vector<Employee*> staff; for (Employee* employee : staff) { employee->RaiseSalary(); } Может поможет осознать :)

Сергей Казьмин
Например, у тебя есть вектор указателей на базовый...

Спасибо! Теперь стало понятно! Это сильно лучше чем все, что я нашла в гугле (там один и тот же пример в разных статьях). Вам стоит подумать чтоб написать об этом книгу 🙂

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Раз начали говорить про embassy, то присоединюсь со своими парой вопросов. 1) Есть ли сопоставимые аналоги для асинхронного кода в emdebbed? 2) Можно ли внутри задач embassy ...
NI_isx
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
4
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта