Ответ 1
В этом случае ни один. Метод производного класса скрывает метод базового класса.
Я немного запутался в двух терминологиях и был бы рад получить некоторые сомнения, разъясненные.
Как я понимаю 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
в базовом классе OR
Метод в методе производного класса overloads
в базовом классе
Используется ли перегрузка в классах классов, а переопределяющий термин не обязательно применим к виртуальным функциям?
Я думаю, что это должно быть overrides
, но просто нужно разъяснение, потому что я помню, что термин переопределение используется конкретно с виртуальными функциями.
В этом случае ни один. Метод производного класса скрывает метод базового класса.
Имя может быть скрыто явным объявлением того же имени во вложенной декларативной области или производном классе.
Если виртуальная функция-член vf объявлена в классе Base и в классе Derived, полученном прямо или косвенно из Base, объявлена функция-член vf с тем же именем и тем же списком параметров, что и Base:: vf, затем Derived:: vf также является виртуальным, и он переопределяет Base:: vf.
Если для одного имени в одной и той же области указано два или более разных объявления, это имя считается перегруженным.
Итак, это, очевидно, случай сокрытия.
Функция перегрузка - это когда у вас есть несколько функций, которые отличаются в списке параметров или, если они являются функциями-членами, в const
/volatile
квалификация. (В некоторых других языках вы также можете перегрузить на основе возвращаемого типа, но С++ этого не допускает.)
Примеры:
void f(int);
void f(char);
class some_class {
void g();
void g() const;
};
Функция переопределяет, когда вы переопределяете функцию базового класса с той же самой подписью. Обычно это имеет смысл только в том случае, если функция базового класса является виртуальной, поскольку в противном случае вызываемая функция (версия базового или производного класса) определяется во время компиляции с использованием статического типа reference/pointer. Примеры:
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 scope
void f(double);
};
void g()
{
derived2 d;
d.f(42); // calls base::f(int)!
}
На всякий случай это неясно: на основе этих определений я бы назвал рассматриваемый сценарий здесь переопределяющим.
Перегрузка - это процесс определения нескольких методов с одинаковыми именами, но с разными сигнатурами; Переопределение - это когда функция в дочернем классе имеет идентичную подпись с виртуальной функцией в родительском классе.
class Test {
// Test::func is overloaded
virtual void func(int x);
virtual void func(double y);
};
class Child : public Test {
// Child::func overrides Test::func
virtual void func(int x);
};