sencillos polimorfismo metodo herencia ejemplos dev c++ inheritance polymorphism virtual

polimorfismo - C++ miembro función virtual anulación y sobrecarga al mismo tiempo



polimorfismo java (3)

Si tengo un código como este:

struct A { virtual void f(int) {} virtual void f(void*) {} }; struct B : public A { void f(int) {} }; struct C : public B { void f(void*) {} }; int main() { C c; c.f(1); return 0; }

Aparece un error que dice que estoy tratando de hacer una conversión inválida de int a void *. ¿Por qué el compilador no puede darse cuenta de que tiene que llamar a B :: f, ya que ambas funciones se declaran como virtuales?

Después de leer la respuesta de jalf, fui y la reduje aún más. Este no funciona tan bien. No es muy intuitivo.

struct A { virtual void f(int) {} }; struct B : public A { void f(void*) {} }; int main() { B b; b.f(1); return 0; }


Bueno, creo que primero no entendiste qué mecanismo virtual o polimorfismo. Cuando el polimorfismo se logra solo mediante punteros a objetos. Creo que eres nuevo en c ++. Sin utilizar punteros a objetos, no hay ningún significado de polimorfismo o puntero de clase base de uso de palabra clave virtual y le asigna los objetos de clase derivados deseados. Entonces llámalo y pruébalo.


La respuesta corta es "porque así es como funciona la resolución de sobrecarga en C ++".

El compilador busca funciones F dentro de la clase C, y si encuentra alguna, detiene la búsqueda e intenta elegir un candidato entre ellas. Solo se ve dentro de las clases base si no se encontraron funciones coincidentes en la clase derivada.

Sin embargo, puede introducir explícitamente las funciones de la clase base en el espacio de nombres de la clase derivada:

struct C : public B { void f(void*) {} using B::f; // Add B''s f function to C''s namespace, allowing it to participate in overload resolution };


O podrías hacer esto:

void main() { A *a = new C(); a->f(1); //This will call f(int) from B(Polymorphism) }