Перегрузка функций и возвращаемый тип в C++

Опубликовано: 15 Сентября, 2022

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

Почему перегрузка функции невозможна с разными типами возвращаемого значения?

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

Пример: если есть две функции: int sum() и float sum() , эти две будут генерировать ошибку времени компиляции, поскольку перегрузка функций здесь невозможна.

Давайте разберемся в этом дальше через следующие программы на C++ и Java:

Программа С++:

CPP




// CPP Program to demonstrate that function overloading
// fails if only return types are different
#include <iostream>
int fun() { return 10; }
  
char fun() { return "a"; }
// compiler error as it is a new declaration of fun()
  
// Driver Code
int main()
{
    char x = fun();
    getchar();
    return 0;
}

Выход

prog.cpp: In function ‘char fun()’:
prog.cpp:6:10: error: ambiguating new declaration of ‘char fun()’
char fun() { return "a"; }
         ^
prog.cpp:4:5: note: old declaration ‘int fun()’
int fun() { return 10; }
    ^

Java-программа:

Java




// Java Program to demonstrate that function overloading
// fails if only return types are different
  
// filename Main.java
public
class Main {
public
    int foo() { return 10; }
public
    char foo() { return "a"; }
    // compiler error as it is a new declaration of fun()
public
    static void main(String args[]) {}
}

Выход

prog.java:10: error: method foo() is already defined in class Main
   char foo() { return "a"; }
        ^
1 error

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсуждаемой выше.