Полиморфизм по функциональному параметру

Хорошо - это может быть очень глупый вопрос, но это меня беспокоило.

Есть ли язык, на котором

class Animal;
class Ape : public Animal
{...}

void doStuff(Animal* animalPtr)
{
    cout << "doing animal stuff" << endl;
}

void doStuff(Ape* apePtr)
{
    cout << "doing ape stuff" << endl;
}

Animal *ape = new Ape();
doStuff(ape);

даст "doing ape stuff"? (пожалуйста, не стесняйтесь использовать синтаксис С++) Чтобы уточнить, я хочу "функцию, которая принимает аргумент и действует на него в соответствии с типом аргумента".

И это имело бы смысл? Конечно, как разработчик вам нужно будет заботиться, потому что экземпляры, которые выглядят так же, как указатель Animal, могут на самом деле вызывать код Ape, потому что во время выполнения он указывает на экземпляр Ape.

Ответ 1

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

Ответ 3

Потенциально, но это не будет С++, поскольку функция перегрузки поиска в С++ выполняется во время компиляции, а не во время выполнения, как требуется здесь. Для этого потребуется динамический язык, который позволяет вводить типы и перегружать.

Ответ 4

Здесь есть некоторая несогласованность, которая сбивает с толку. Вы хотите функцию, которая принимает аргумент и действует на него в соответствии с типом аргумента? На самом деле это не был бы полиморфизм, поскольку функции находятся на их одиночестве, они не являются методами, принадлежащими иерархии классов или интерфейсов. Другими словами, его вид напоминает смешивание парадигм ОО с процедурной парадигмой.

Если это тип, который вы хотите параметризовать, а не переменную, вы должны использовать что-то вроде Java Generics. С помощью дженериков вы можете сообщить методу, что тип входящего параметра также будет переменным. Метод действует на тип переменной в общем виде.

Ответ 5

Открыть Multi-Методы для С++, Питером Пиркельбауэром, Юрием Солодким и Бьярном Страуступом.

В этом документе обсуждается расширение языка для интеграции нескольких методов в С++ наряду с некоторыми очень интересными деталями реализации, такими как работа с динамически загружаемыми библиотеками и фактический макет для правильной отправки. Обратите внимание, что он еще не является частью стандарта С++ и, вероятно, не является частью какого-либо крупного компилятора.