Полиморфизм по параметру функции - PullRequest
10 голосов
/ 31 января 2010

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

Есть ли язык где

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"? (пожалуйста, потерпите меня, используя синтаксис C ++) Чтобы уточнить, я хочу «функцию, которая принимает аргумент и действует на него в соответствии с типом аргумента».

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

Ответы [ 5 ]

7 голосов
/ 31 января 2010

Взгляните на Шаблон посетителя

7 голосов
/ 31 января 2010

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

1 голос
/ 31 января 2010

Открытые мульти-методы для C ++ , авторы Peter Pirkelbauer, Yuriy Solodkyy и Bjarne Stroustrup.

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

1 голос
/ 31 января 2010

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

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

1 голос
/ 31 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...