sobrecargar - sobrecarga del operador<< c++
Sobrecargas de funciones miembro heredadas (3)
Cuando declara un método en la subclase con el mismo nombre pero con una firma diferente, en realidad oculta la versión del padre.
Puede referirse específicamente a Bound :: rebote (...) o utilizar la palabra clave using.
Mira aquí
¿Puede una clase sobrecargar métodos que también existen en la interfaz heredada públicamente? Parece que esto no es ambiguo y útil, pero los compiladores (VC, Intel, GCC) todos se quejan, al menos por mi construcción. A continuación se muestra un ejemplo de juguete. La función heredada de rebote () tiene dos sobrecargas claras, sin embargo, esto no se compilará. Si cambia el nombre del método rebote () en cualquier clase, funciona bien, pero si comparten el mismo nombre de función miembro (¡aunque estén sobrecargados con diferentes tipos de argumentos!) Se obtiene un error fatal de "muy pocos argumentos para funcionar" llamada."
La solución alternativa es trivial (voy a cambiar el nombre de los métodos), pero estoy tratando de entender si se trata de una restricción de C ++ (y por qué sería).
#include
class Bound {
public:
Bound() : x0(0.0), x1(0.0) {};
Bound(double x) : x0(x), x1(x) {};
double width() const {return x1-x0;}
void rebound(const Bound *a, const Bound *b);
private:
double x0, x1;
};
void Bound::rebound(const Bound *a, const Bound *b)
{
if (a && b) {
x0=std::min(a->x0, b->x0);
x1=std::max(a->x1, b->x1);
}
}
class Node : public Bound {
public:
Node(double x) : Bound(x), left(0), right(0) {};
Node(Node *a, Node *b) : left(a), right(b) {rebound();}
void rebound() { rebound(left, right); }
private:
Node *left;
Node *right;
};
int main() {
Node A(1.0);
Node B(2.0);
Node C(&A, &B);
}
Esto se llama ocultar la función miembro principal. Puede llamarlo explícitamente (mediante Bound::rebound(left, right)
como dijo @Ates Goral) o puede agregar un using Bound::rebound
en su definición de clase de Node
.
Consulte http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.9 para obtener más información.
Puedes hacer tres cosas:
1. Mostrar el método de la clase base
Agregue un using
en la declaración de Node
:
using Bound::rebound;
void rebound() { rebound(left, right); }
2. Referirse explícitamente al método de la clase base
Use el espacio de nombres Bound:
void rebound() { Bound::rebound(left, right); }
3. Definir / redefinir todas las sobrecargas en la clase derivada
Delegue la implementación a la clase base (si esto se hace en el encabezado, no debe haber ninguna penalización gracias a la incorporación):
void rebound(const Bound *a, const Bound *b) { Bound::rebound(a, b); };
void rebound() { rebound(left, right); }
Más información: https://isocpp.org/wiki/faq/strange-inheritance#overload-derived