В чем различие полиморфизма и перегрузки?

В чем отличие полиморфизма и перегрузки в ЯП c++? В некоторых источниках говорится что это одно и тоже.
  • Вопрос задан
  • 9804 просмотра
Решения вопроса 2
@Alexander1705
При перегрузке ты можешь перегрузить функцию для разных количества и типов аргументов, но для каждого случая нужно отдельно определять функцию.
int plus(int a, int b) {return a + b;}
float plus(float a, float b) {return a + b;}
double plus(double a, double b) {return a + b;}
unsigned long long plus(unsigned long long a, unsigned long long b) {return a + b;}
// выбьет ошибку для любого другого типа, кроме int, float, double, unsigned long long

При использовании шаблонов ты определяешь шаблон только однажды, а компилятор сам сгенерирует определение стольких функций сколько потребуется.
template<typename T>
T plus(T a, T b) {return a + b;}
// Работает для любых типов, которые определяют opeator+


P.S. По сути, и перегрузка и шаблоны это и есть средства полиморфизма.
Ответ написан
maaGames
@maaGames
Погроммирую программы
Не слушай их ^^^, они вводят тебя в заблуждение.

1. Перегрузка есть. Полиморфизмом и не пахнет.
int Sum(int a, int b)
{ return a+b; }

double Sum(double a, double b)
{ return a+b; }


2. Полиморфизм есть. Пергрузкой и не пахнет
class A
{
  virtual ~A(){}
  virtual char* Name() { return "Class A"; }
};

class B
{
 virtual char* Name() { return "Class B"; }
};

void main()
{
    A* a1 = new A;
    A * a2 = new B;

   cout << a1->Name(); // Class A
   cout << a2->Name(); // Class B
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@nesterione
Перегрузка это и есть одно из проявлений полиморфизма.

Всего есть различные виды полиморфизма (ответ больше для C# и Java, если для c++ что-то не так, поправьте меня):
* динамический: это когда программа во время выполнения решает какой код исполнять. Это происходит при наследовании: когда ты переопределяешь функцию в другом классе (виртуальные методы, абстрактные)
* статический: на стадии компиляции все известно, это как раз перегрузка методов. Компилятор исходя из аргументов выбирает нужный метод
Ответ написан
Комментировать
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
дополню nesterione

Перегрузка методов дает нам как раз таки полиморфизм. Если мы говорим о перегрузке методов родительского класса то такой вид полиморфизма называют "полиморфизмом подтипов". Если речь идет о добавлении функции или метода с тем же названием но другими типами аргументов - это "специализированный полиморфизм" (или ad hoc). Если речь о обобщенном прогреммировании (шаблоны) - то "параметрический полиморфизм".

То есть перегрузка методов - частный случай полиморфизма.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы