Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Nick_, Вы писали:
VD>Статический когда выбор конкретного варианта осуществляется компилятором (перегрузка и т.п.) и динамический кодга конкретный вариант выбирается в рантайме на базе динамического выбора.
Я не вижу тут разницы. Если компилятор С++ знает тип объекта у которого вызывается виртуальный метод, то он может подставить сразу вызов необходимого метода в обход таблиц виртуальных функций.
В С++ есть четкое деление на "статический" и "динамический" полиморфизмы только потому, что у них различается синтаксис. Если хочешь рантайм поддержку приходится писать x->foo(y);
В функциональных языках если компилятор знает тип аргумета, то вызывает конкретную функцию, если не знает, то это делает рантайм. В обоих случаях вызов записывается одинаково: foo x y
N_>>Я знаю только ad-hoc и параметрический полиморфизмы.
VD>Не думаю, что этот термин реально прижился. Не все из Википедии нужно брать на вооружении.
Может этот термин и не прижился в рядах web программистов, но в рядах ученых он используется.
N_>>ad-hoc — это перегрузка(overloading) и то, что обычно понимается под полиморфизмом в С++. N_>>parametric — это то, что в функциональных языках понимается под полиморфизмом. N_>>Шаблоны в С++ — это подобие параметрического полиморфизма.
VD>Это все не типизация. Это общие разрозненные слова. Реально имет значение смысл полиморфизма: создание универсального кода (процедур, функций, методов) или типов, т.е. так чтобы код и типы можно было абстрагировать от конкретных используемых в них типов.
Сложно формально описать систему типов в функциональных языках. Наверное это проще сделать на примерах.
Я на досуге попробую найти хороший пример на хаскеле.
VD>Ну, а дальше можно выделить два подкласса — это статический полиморфизм и динамический. Динамический требует выбора в рантайме, статический ведет к генерации множества вопложений полиморфного кода и типов.