Скрытие всех перегруженных методов с одинаковым именем в базовом классе C++

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

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

Например, следующая программа не компилируется. Здесь Derived переопределяет базовый метод fun(), и это делает fun(int i) скрытым.

CPP




// CPP Program to demonstrate derived class redefines base
// class member method and generates compiler error
#include <iostream>
using namespace std;
  
class Base {
public:
    int fun() { cout << "Base::fun() called"; }
    int fun(int i) { cout << "Base::fun(int i) called"; }
};
  
class Derived : public Base {
public:
    int fun() { cout << "Derived::fun() called"; }
};
  
// Driver Code
int main()
{
    Derived d;
    d.fun(5); // Compiler Error
    return 0;
}

Выход

prog.cpp: In function ‘int main()’:
prog.cpp:20:12: error: no matching function for call to ‘Derived::fun(int)’
    d.fun(5); // Compiler Error
           ^
prog.cpp:13:9: note: candidate: int Derived::fun()
    int fun() { cout << "Derived::fun() called"; }
        ^
prog.cpp:13:9: note:   candidate expects 0 arguments, 1 provided

Даже если сигнатура метода производного класса отличается, все перегруженные методы базового класса становятся скрытыми. Например, в следующей программе Derived::fun(char) делает скрытыми и Base::fun(), и Base::fun(int).

Note: The above facts are true for both static and non static methods.

Есть способ смягчить этот вид проблемы. Если мы хотим перегрузить функцию базового класса, ее можно отобразить с помощью ключевого слова «using». Это ключевое слово переносит метод или переменную базового класса в область видимости текущего класса.

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

C++ C