Ocultación de todos los métodos sobrecargados con el mismo nombre en la clase base en C++

En C++, la sobrecarga de funciones es posible, es decir, dos o más funciones de la misma clase pueden tener el mismo nombre pero diferentes parámetros. Sin embargo, si una clase derivada redefine el método miembro de la clase base, todos los métodos de la clase base con el mismo nombre se ocultan en la clase derivada. 

Por ejemplo, el siguiente programa no compila. Aquí, Derived redefine el método fun() de Base y esto hace que fun(int i) se oculte.

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;
}

Producción

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

Incluso si la firma del método de la clase derivada es diferente, todos los métodos sobrecargados de la clase base se ocultan. Por ejemplo, en el siguiente programa, Derived::fun(char ) oculta Base::fun() y Base::fun(int ).

CPP

// CPP Program to demonstrate derived class redefines base
// class member method
#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;
}
Producción

Derived::fun(char c) called

Nota: Los hechos anteriores son válidos tanto para métodos estáticos como no estáticos .

Hay una manera de mitigar este tipo de problema. Si queremos sobrecargar una función de una clase base, es posible mostrarla usando la palabra clave ‘using’. Esta palabra clave trae un método o variable de clase base al ámbito de la clase actual.

C++

// CPP Program to demonstrate derived class redefines base
// class member method using the 'using' keyword
#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 )
                    // unhidden
    {
        cout << "Derived::fun(char c) called";
    }
};
  
// Driver Code
int main()
{
    Derived d;
    d.fun(); // Works fine now
    return 0;
}
Producción

Base::fun() called

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente. 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *