Скрытие всех перегруженных методов с тем же именем в базовом классе
In C++, if a derived class redefines base class member method then all the base class methods with same name become hidden in derived class.
For example, the following program doesn’t compile. In the following program, Derived redefines Base’s method fun() and this makes fun(int i) hidden.
CPP
#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; } |
Even if the signature of the derived class method is different, all the overloaded methods in base class become hidden. For example, in the following program, Derived::fun(char ) makes both Base::fun() and Base::fun(int ) hidden.
CPP
#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 : // Makes Base::fun() and Base::fun(int ) // hidden int fun( char c) { cout << "Derived::fun(char c) called" ; } }; // Driver Code int main() { Derived d; d.fun( "e" ); // No Compiler Error return 0; } |
Derived::fun(char c) called
Обратите внимание, что приведенные выше факты верны как для статических, так и для нестатических методов.
There is a way mitigate this kind of issue. If we want to overload a function of a base class, it is possible to unhide it by using the ‘using’ keyword.
C++
#include<iostream> using namespace std; class Base { public : int fun() { cout<< "Base::fun() called" ; } }; class Derived: public Base { public : using Base::fun; int fun( char c) // Makes Base::fun() and Base::fun(int ) hidden { cout<< "Derived::fun(char c) called" ; } }; int main() { Derived d; d.fun(); // Works fine now return 0; } |
Base::fun() called
Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.