Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Repikas en 25 Junio 2017, 21:25 pm



Título: ¿Por qué es ambigua la llamada a este método?
Publicado por: Repikas en 25 Junio 2017, 21:25 pm
Buenas, en el siguiente código se intenta llamar a una función f de la clase D, que hereda de B y C, en esta clase hay un sólo método f() ya que no hay duplicados al heredar virtualmente y un método f(int), los métodos se llaman igual pero reciben distinto tipo de parámetro, ¿por qué es ambiguo entonces?
Código:
struct A {
    void f() {}
};

struct B: virtual A {
    void f(int i) {}
};

struct C: virtual A {
    void f() {}
};

struct D: B, C {

};

int main()
{
    D d;
    d.f(5); //ambiguo
}

Gracias y un saludo


Título: Re: ¿Por qué es ambigua la llamada a este método?
Publicado por: ivancea96 en 26 Junio 2017, 14:43 pm
Un par de conceptos rápidos.

Si una clase hereda de otra  y tiene un método con el mismo nombre y diferentes parámetros, el método de la clase base no serña visible (salvo que se utilice un using A::f; dentro de la clase hija)

Sin embargo, ese no es el problema aquí. Aquí el problema es que si D hereda de 2 clases que tienen 2 métodos con el mismo nombre, habrá ambigüedad aunque tengan diferentes parámetros. Para evitarlo, puedes escribir using para cada función:
Código
  1. using B::f;
  2. using C::f;

En cualquier caso, salvo que vayas a heredar de una clase con funciones virtuales o salvo que quieras realmente eliminar la función de la base, mejor evitar tener métodos con el mismo nombre en diferentes clases de una herencia.