una punteros programacion lenguaje funciones funcion estructuras estructura ejemplos anidadas c++ class inheritance polymorphism virtual

punteros - ¿Por qué una llamada a la función de una estructura de C++ es ambigua si hay miembros heredados con diferentes parámetros?



programacion en c++ (2)

El problema aquí es con la búsqueda de nombres de miembros, que se produce antes de evaluar qué funciones son viables y aplicar la resolución de sobrecarga. Cuando la búsqueda de nombres encuentra nombres de dos o más clases básicas no relacionadas, esto se considera una búsqueda ambigua, que es inmediatamente inválida.

Para obtener más detalles, lea acerca de la búsqueda de nombres no calificados en las definiciones de miembros de clase . (Este no es realmente el contexto que tiene aquí, pero las mismas reglas se aplican a una expresión de acceso de miembro).

Puede solucionar este problema especificando la clase base donde desea que comience la búsqueda, utilizando un id-calificado:

d.B::f(5);

O bien, podría hacer que ambas funciones sean explícitamente visibles directamente en D :

struct D: B, C { using B::f; using C::f; };

El código está abajo. Tengo una sola función f () y una sola función f (int) en mi clase D, entonces, ¿por qué es ambigua esa llamada si ambas funciones tienen parámetros diferentes?

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


La llamada es ambigua porque las bases A y C de la estructura D tienen una función llamada void f() , incluso si la f() está oculta. Para desambiguar, debe declarar f () en D.

struct A { void f() {} }; struct B: virtual A { void f(int i) {} // < hides A::f(), even if signature is different, }; struct C: virtual A { void f() {} // < hides A::f() }; struct D: B, C { // f(...) functions in both base... which one hides the other? };