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