unarios sobrecargar sobrecarga sencillos que operadores operador metodos esta ejemplos compuesta c++ inheritance overloading

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



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