Вопросы с тегом 'overloading'

___ qstntxt ___

Я узнал что-то новое о C ++ на днях; следующее не работает:

%pre%

Однако выполнение точно такой же вещи в Java (среди других языков) работает так, как я ожидал:

%pre%

Итак, что дает в C ++? Почему это скрывает имя, а не перегружает его?

    
___ answer28586469 ___

Основное отличие состоит в том, что в C ++ подпись метода - это просто имя метода, тогда как в Java это имя метода и .

В вашем случае, используя одно и то же имя метода, вы переопределяете родительский метод, поэтому родительский метод без параметров больше не доступен. В Java вы должны переопределить метод, в котором оба имеют одинаковое имя и имеют те же параметры, что и переопределять метод, поэтому в вашем случае они оба доступны.

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

    
___ answer28586608 ___

Если вы спрашиваете, что такое правила, то поиск имени останавливается, как только он находит одну или несколько перегрузок в пределах одной области видимости и не смотрит на какие-либо более широкие области. Итак, в вашем случае поиск %code% начинается с области %code% , находит совпадение и останавливается.

Учитывается только имя, а не его использование (например, количество аргументов в вызове функции), доступность или что-то еще. Если ни одна из перегрузок не используется, поиск по-прежнему не продолжается в других областях, и программа плохо сформирована.

Если вы спрашиваете, почему правила подобны этому, рассмотрите случай, когда изначально есть только одна функция:

%pre%

, и кто-то вызывает его с типом, который не совсем соответствует

%pre%

Теперь предположим, что кто-то, кто ничего не знает о %code% , решает, что %code% может сделать с другой функцией:

%pre%

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

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

%pre%

В качестве альтернативы, чтобы избежать описанной выше ситуации за счет некоторых утомительных слов, вы могли бы написать функцию пересылки для конкретной перегрузки (-ов), которую вы хотите:

%pre%     
___ answer28586410 ___

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

В C ++ фазы процесса вызова функции следующие:

  • Поиск имени
  • Разрешение перегрузки
  • Контроль доступа

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

После процесса поиска имени с ошибкой перегрузки возникает ошибка, так как в %code% нет %code% .

    
___ tag123c ___ C ++ - это язык программирования общего назначения. Он был первоначально разработан как расширение для C и сохраняет похожий синтаксис, но теперь он совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C ++ 11], [C ++ 17] и т. Д. ___ tag123перегрузка ___ Термины перегрузки и перегрузки могут означать:   - Перегрузка конструктора и метода, тип полиморфизма, когда вызываются разные функции с тем же именем на основе типов данных переданных параметров   - Перегрузка оператора, форма перегрузки функций или методов, когда перегруженное действие является оператором, таким как + или - ___ tag123java ___ Java (не путать с JavaScript или JScript или JS) - это объектно-ориентированный язык программирования общего назначения, предназначенный для использования в сочетании с виртуальной машиной Java (JVM). «Java-платформа» - это название вычислительной системы, в которой установлены инструменты для разработки и запуска программ Java. Используйте этот тег для вопросов, относящихся к языку программирования Java или инструментам платформы Java. ___ qstnhdr ___ Имя Скрытие в C ++ vs Java [дубликат] ___
4
ответа

Оператор перегрузки -

Вот мой пример кода: class X { public: void f() {} }; class Y : public X { public: X& operator->() { return *this; } void f() {} }; int main() { Y t; t.operator->().f(); // OK t->...
задан 04.02.2011 в 10:07
7
ответов

Переопределение метода с разными типами возвращаемых значений в java?

Я прочитал книгу, и она говорит, что я могу переопределить метод, если он имеет одну и ту же подпись. согласно книге подпись метода - это имя метода_имя + переданные параметры. в соответствии с книгой, я могу переопределить метод, который име...
задан 25.01.2013 в 11:24
2
ответа

Delphi: метод «Create» скрывает виртуальный метод базы - но он прямо там

Рассмотрим иерархию гипотетических объектов, начиная с: TFruit = class(TObject) public constructor Create(Color: TColor); virtual; end; и его потомка: TApple = class(TFruit) public constructor Create(); overload; virtual; c...
задан 01.02.2012 в 21:58
4
ответа

Перегрузка - это полиморфизм во время компиляции. В самом деле?

Я знаю синтаксическую разницу между переопределением и перегрузкой. И я также знаю, что переопределение - это полиморфизм во время выполнения, а перегрузка - это полиморфизм во время компиляции. Но мой вопрос: «Является ли перегрузка действитель...
задан 02.12.2011 в 12:50
3
ответа

Перегрузка метода с помощью необязательного параметра

У меня есть класс следующим образом с двумя методами перегрузки. Class A { public string x(string a, string b) { return "hello" + a + b; } public string x(string a, string b, string c = "bye") { return c +...
задан 30.08.2016 в 07:12
2
ответа

Почему перегрузка шаблона и функции без шаблона с помощью «той же сигнатуры» вызывает функцию без шаблона?

У меня есть этот код: template< class T = const int & > void f(T) {} void f(const int &) {} int main() { f(0); } Почему он вместо второго вызывает второй? Я бы подумал, что они такие же, но они явно не такие, как я...
задан 02.02.2013 в 21:30
1
ответ

Почему переадресация ссылок не работает в этом случае?

#include <vector> using namespace std; template<typename T, typename = decltype(&T::size)> void f1(T) {} template<typename T, typename = decltype(&T::size)> void f2(T&) {} template<typename T, typename = decl...
задан 23.02.2017 в 08:47
6
ответов

Соответствие перегруженной функции ее полиморфному аргументу

Хорошо, название - это глоток, и я думаю, что, вероятно, поэтому было сложно найти ответ через Google или этот сайт. Возможно, я не знаю, как правильно выражать проблему, но здесь говорится: У меня есть ряд методов в классе SimpleOpenGLRende...
задан 01.08.2011 в 13:20
3
ответа

Неверное поведение при перегрузке метода

Я борюсь со странным, по крайней мере для меня, методом, перегружающим разрешение .net. Я написал небольшой образец, чтобы воспроизвести проблему: class Program { static void Main(string[] args) { var test = new OverloadTest()...
задан 11.01.2010 в 18:26
2
ответа

Перегрузить поведение count () при вызове определенных объектов [дубликат]

В PHP 5 вы можете использовать магические методы, перегружать некоторые классы и т. д. В C ++ вы можете реализовывать функции, которые существуют до тех пор, пока типы аргументов различны. Есть ли способ сделать это в PHP? Пример того, чт...
задан 14.12.2011 в 19:52