Мне понятно когда нужен полиморфизм, но тут поведение зависит от указателей, а я не очень поинмаю когда это применяется. Если я использую MyExtendedClass унаследованный от BaseClass, то я не встречусь с указателем на базовый класс соответственно и virtual не будет нужен.
вон выше простой пример)
Если ты не юзаешь наследника через указатель на базу, то и virtual тут не нужен, естественно)
А когда нужен? Когда я в уже существующем коде заменяю какой-то один базовый класс своим и все остальные части этой программы получают по ссылке вместо базового класса мой новый и пытаются работать с ним как со старым?
Не со старым, а по контракту базового класса.
Например, у тебя есть вектор указателей на базовый класс, к которой ты хочешь применить один и тот же метод в цикле, но при этом тебя не очень волнует, какие конкретно сущности там представлены. Для наглядности, пусть у тебя будет базовый класс 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(); } Может поможет осознать :)
Спасибо! Теперь стало понятно! Это сильно лучше чем все, что я нашла в гугле (там один и тот же пример в разных статьях). Вам стоит подумать чтоб написать об этом книгу 🙂
Обсуждают сегодня