http://rsdn.ru/Forum/message/2853873.1.aspxR>Подумалось... насколько верен термин "Полиморфизм" в отношении ООП.
R>Язык программирования поддерживает полиморфизм, если классы с одинаковой спецификацией могут иметь различную реализацию - например, реализация класса может быть изменена в процессе наследования. (с) Вики
R>А смысл самого слова с греческого - нечто, что обладает многими формами.
R>Но в ООП смысл ИМХО другой - есть ОДНА форма (например интерфейс), но РАЗНЫЕ содержания (реализации)!
R>Или я неправ?
Хотите волшебным образом наведем порядок в голове, и быстро?
Полиморфная переменная == переменная, которая может принимать значения разных типов данных.
Полиморфная функция == функция, у которой хотя бы один аргумент является полиморфной переменной.
Полиморфная функция бывает двух видов.
Ad-hoc полиморфизм - функция ведет себя по разному для аргументов разных типов. Функция "нарисовать" - рисует по разному разные геометрические фигуры.
Параметрический полиморфизм - функция ведет себя одинаково для аргументов разных типов. Пример - функция "положить элемент в контейнер".
Полиморфизм бывает естественным и искусственным.
Естественный - когда информация о типе проходит автоматически, вместе со значением. И язык поддерживает Ad-hoc полиморфизм явным образом.
Искусственный полиморфизм - когда информация о типе протаскивается отдельными параметрами. Например, printf - полиморфная функция. Информация о типе аргументов идет в форматной строке - первым аргументом.
Иногда выделяют статический и динамический полиморфизм - когда тип разрешается во время компиляции, или во время выполнения.
О полиморфизме все. Обратите внимание - слова "класс" и ничего относящегося к ООП здесь нет. Теперь об ООП.
Когда вы вызываете метод класса - это вызов функции, "нулевым" (неявным) аргументом которой идет объект (на этот аргумент ссылаются как this).
Рассмотрим для примера естественный полиморфизм языка С++.
Времени компиляции:
1) Перегрузка функций. Тип аргументов является частью сигнатуры. Имеем Ad hoc полиморфизм.
2) Шаблонные функции. Параметрический полиморфизм. В сочетании со специализацией - имеем также и ad hoc - опять. Довольно гибко.
Времени выполнения:
1) Указатель на базовый класс - полиморфная переменная. Любая функция, принимающая такое аргументом - будет обладать параметрическим полиморфизмом. Обратите внимание - наследование в С++ и других строготипизированных ОО языках является ослаблением системы типов, и средством обеспечения параметрического полиморфизма в рантайме. Это еще одна функция наследования, выходящая за рамки классического ОО по определению Алана Кея, которое реализовано в Смоллтоке. Потому, что Смоллток динамически типизирован, и там любая переменная - полиморфна. Соответственно - там вообще любая функция обладает параметрическим полиморфизмом по всем своим аргументам. И там, как следствие, не нужны шаблоны, как в С++, и generics, как в C#. Обратите внимание - мы сейчас касаемся фундаментальных свойств языков и языкостроения вообще.
2) Виртуальная функция - ad-hoc полиморфна по единственному неявному аргументу. Единственному, и неявному. Это слабое свойство ОО модели вообще, вынуждающее городить страшные паттерны, такие как Visitor и double dispatch, когда требуется ad-hoc полиморфизм не по одному аргументу, а по нескольким. Решение этой проблемы - мультиметоды, которые есть в некоторых ОО системах, и были предложены к включению в стандарт С++.
Кажется, ничего не пропустил насчет полиморфизма в С++. Вы можете теперь разложить по полочкам любой известный вам язык самостоятельно.