Необходимость полиморфизма заключается в необходимости обработки разных данных таким же образом. Вместо того, чтобы переопределять один и тот же алгоритм для набора данных с разными формами, было бы намного проще иметь только одну реализацию этого алгоритма и параметризовать его с помощью разных операторов?
В этом суть полиморфизма. Вы начинаете с алгоритма, устанавливаете интерфейс, с которым он должен взаимодействовать, а затем создавайте реализации этого интерфейса. В C++ понятие интерфейса подразумевается в каждом классе. Любой класс предоставляет один интерфейс (хотя он может поддерживать многие интерфейсы через своих предков), а его потомки также реализуют его. Делая определенные методы виртуальными, потомки могут переопределять и адаптировать их к своим собственным внутренним структурам, не изменяя, как объект манипулируется снаружи.
Таким образом, полиморфизм - это то, что ценности, которые могут принимать разные формы, и средства доступа и управления ими в одностороннем порядке. Ключевым моментом в ответе на ваш вопрос является то, что алгоритм не знает, какой эффект он манипулирует. Вы предоставляете тривиальный пример, где код знает, что он работает с экземпляром Derived
, и поэтому может вызывать его методы напрямую. В общем коде или коде, ссылающемся на интерфейс (так сказать), этого знания не существует, что заставляет код полагаться на методы базового класса (и требует от программиста обеспечения того, чтобы классы, которые он планировал использовать с этим кодом четко определены - то есть виртуальные - там, где это необходимо).
Есть много полезных применений полиморфизма, но все они вытекают из приведенного выше принципа:
- гетерогенного набора данных (как показано другими ответами),
- injection (в котором различные реализации одного и того же интерфейса могут быть заменены друг на друга во время выполнения),
- тестирование (а точнее, насмешка, в которой классы, которые взаимодействуют с данным классом C, заменяются манекенами, которые помогают проверить правильное поведение C),
, чтобы назвать несколько. Обратите внимание, что полиморфизм времени компиляции (шаблоны) и полиморфизм времени выполнения (virtual
методы и наследование) достигают этой цели, хотя и по-другому, и с разными плюсами и минусами.
проверьте пример здесь: http://www.cplusplus.com/doc/tutorial/polymorphism/, если вам нужна коллекция этих объектов или вы не знаете точный подтип объекта (потому что он зависит от конфигурация, ввод пользователя и т. д.), вам нужен полиморфизм. –
Итак, ваш вопрос в том, почему существует необходимость в виртуальных методах? – Inspired
_ "но зачем мне создавать объект с разными типами? _ Оба примера создают объект того же типа, разница - тип указателя, который вы используете для его ссылки, но оба примера создают' Derived'. –