перегрузка против переопределения - PullRequest
12 голосов
/ 23 марта 2011

Я немного смущен двумя терминологиями и был бы рад прояснить некоторые сомнения.

Как я понимаю, function overloading означает наличие нескольких методов в одном классе с одним и тем же именем, но с разным количеством аргументов, разными типами аргументов или последовательностью аргументов независимо от типа возвращаемого значения, которое не влияет на искаженное имя объекта. функции.

Включает ли приведенное выше определение также «.... в том же классе или в смежных классах (связанных через наследование) .....»

И Function Overriding относится к виртуальным функциям, той же сигнатуре метода (объявленной виртуальной в базовом классе) и переопределенной для реализации в подклассах.

Мне было интересно сценарий, следующий код:

#include <iostream>

class A
{
    public:
    void doSomething(int i, int j)
    {
        cout<<"\nInside A::doSomething\n";
    }
};

class B: public A
{
    public:
    void doSomething(int i, int j)
    {
        cout<<"\nInside B::doSomething\n";

    }
};

int main()
{
    B obj;
    obj.doSomething(1,2);
    return 0;

} 

В приведенном выше сценарии, что можно сказать:
Метод в производном классе overrides Метод в базовом классе ИЛИ
Метод в производном классе overloads Метод в базовом классе

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

Я думаю, что это должно быть overrides, но мне просто нужно пояснение, потому что я вспомнил, что термин переопределение использовался специально с виртуальными функциями.

Ответы [ 4 ]

10 голосов
/ 06 мая 2011
  • скрывается, когда определение в области недоступно из-за объявления во вложенной области или производного класса (3.3.7 / 1).

Aимя может быть скрыто явным объявлением того же имени во вложенной декларативной области или производном классе.

  • Переопределение - это когда виртуальный член заменяется в производном классе (см. 10.3 / 2)

Если виртуальная функция-член vf объявлена ​​в классе Base и в классе Derived, полученном прямо или косвенно из Base, функция-член vf с тем же именем и тем же списком параметровтак как Base :: vf объявлен, то Derived :: vf также является виртуальным и переопределяет его Base :: vf.

  • , когда несколько объявлений сосуществуют дляодно и то же имя в одной и той же области (13/1)

Если для одного имени в одной и той же области указаны два или более разных объявлений, это имя называется перегруженным.

  • связано, также есть возможность замены оператора new и удаления из стандартной библиотеки собственной реализацией (18.4.1.1/2, 18.4.1.1/6, 18.4.1.1/11, 18.4.1.2)

Так что это явно случай сокрытия.

9 голосов
/ 23 марта 2011

В этом случае ни один. Метод производного класса скрывает метод базового класса.

7 голосов
/ 06 мая 2011

Функция перегрузка - это когда у вас есть несколько функций, которые отличаются в своем списке параметров или, если они являются функциями-членами, в их const / volatile квалификация . (В некоторых других языках вы также можете перегрузить в зависимости от типа возвращаемого значения, но C ++ не позволяет этого.)
Примеры:

void f(int);
void f(char);

class some_class {
  void g();
  void g() const;
};

Функция переопределение - это когда вы переопределяете функцию базового класса с такой же подписью . Обычно это имеет смысл, только если функция базового класса является виртуальной, поскольку в противном случае вызываемая функция (версия базового или производного класса) определяется во время компиляции с использованием статического типа ссылки / указателя. .
Примеры:

class base {
  void f();
  virtual void g();
};

class derived : public base {
  void f();
  void g();
};

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

class base {
  void f(int);
  void f(char);
};

class derived1 : public base {
  void f(double);
};

void f()
{
  derived1 d;
  d.f(42); // calls derived1::f(double)!
}

class derived2 : public base {
  using base::f; // bring base class versions into derived2's scope
  void f(double);
};

void g()
{
  derived2 d;
  d.f(42); // calls base::f(int)!
}

На всякий случай неясно: основываясь на этих определениях, я бы назвал рассматриваемый сценарий здесь overriding .

5 голосов
/ 23 марта 2011

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

...