Скрытие всех перегруженных методов с одинаковым именем в базовом классе C++
В 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». Это ключевое слово переносит метод или переменную базового класса в область видимости текущего класса.
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсуждаемой выше.