¿Por qué es ambigua la llamada a este método?

Iniciado por Repikas, 25 Junio 2017, 21:25 PM

0 Miembros y 1 Visitante están viendo este tema.

Repikas

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?
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

ivancea96

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 (cpp) [Seleccionar]
using B::f;
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.