Рубрики

Работает ли перегрузка с наследованием?

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

   
#include <iostream>

using namespace std;

class Base

{

public:

    int f(int i)

    {

        cout << "f(int): ";

        return i+3;

    }

};

class Derived : public Base

{

public:

    double f(double d)

    {

        cout << "f(double): ";

        return d+3.3;

    }

};

int main()

{

    Derived* dp = new Derived;

    cout << dp->f(3) << '\n';

    cout << dp->f(3.3) << '\n';

    delete dp;

    return 0;

}

Выход этой программы:

f(double): 6.3
f(double): 6.6 

Вместо предполагаемого вывода:

f(int): 6
f(double): 6.6 

Перегрузка не работает для производного класса в языке программирования C ++. Между Base и Derived нет разрешения перегрузки. Компилятор смотрит в область действия Derived, находит единственную функцию «double f (double)» и вызывает ее. Это никогда не мешает (охватывая) объемом Base. В C ++ нет перегрузки между областями — области производных классов не являются исключением из этого общего правила. (Смотрите это для большего количества примеров)

Ссылка: технические часто задаваемые вопросы на www.stroustrup.com

Теперь рассмотрим Java- версию этой программы:

class Base

{

    public int f(int i)

    {

        System.out.print("f (int): ");

        return i+3;

    }

}

class Derived extends Base

{

    public double f(double i)

    {

        System.out.print("f (double) : ");

        return i + 3.3;

    }

}

class myprogram3

{

    public static void main(String args[])

    {

        Derived obj = new Derived();

        System.out.println(obj.f(3));

        System.out.println(obj.f(3.3));

    }

}

Вывод вышеуказанной программы:

f (int): 6
f (double): 6.6 

Таким образом, в Java перегрузка работает в разных областях, в отличие от C ++. Компилятор Java определяет правильную версию перегруженного метода, который должен быть выполнен во время компиляции, на основе типа аргумента, используемого для вызова метода, и параметров перегруженных методов обоих этих классов получают значения аргументов, используемых в вызове, и выполняет перегруженный метод.

Наконец, давайте попробуем вывод следующей программы на C # :

   

using System;                     

class Base

{

    public int f(int i)

    {

        Console.Write("f (int): ");

        return i + 3;

    }

}

class Derived : Base

{

    public double f(double i)

    {

        Console.Write("f (double) : ");

        return i+3.3;

    }

class MyProgram

{   

    static void Main(string[] args)

    {

        Derived obj = new Derived();

        Console.WriteLine(obj.f(3));

        Console.WriteLine(obj.f(3.3));

        Console.ReadKey(); // напишите эту строку, если вы используете visual studio

    }

}

Примечание. Console.ReadKey () используется для остановки консоли. Это похоже на getch как в C / C ++.
Вывод вышеуказанной программы:

f(double) : 6.3
f(double):  6.6 

вместо предполагаемого выхода

f(int) : 6
f(double) : 6.6 

Причина та же, что и в программе на C ++. Как и в C ++, между классом Base и классом Derived нет разрешения перегрузки. В C # нет перегрузки между областями действия. Производные области классов не являются исключением из этого общего правила. Это то же самое, что и C ++, потому что C # разработан, чтобы быть намного ближе к C ++, согласно Андерсу Хейлсбергу, создателю языка C #.

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

Рекомендуемые посты:

Работает ли перегрузка с наследованием?

0.00 (0%) 0 votes