Función miembro de C++ anulación virtual y sobrecarga al mismo tiempo


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

Recibo un error que dice que estoy tratando de hacer una conversión inválida de int a void*. ¿Por qué no puede el compilador averiguar que tiene que llamar a B::f, ya que ambas funciones están declaradas 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;
}
Author: bombardier, 2009-02-25

3 answers

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 busca 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
};
 44
Author: jalf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-25 13:11:06

O podrías hacer esto:

void main()
{
    A *a = new C();
    a->f(1);  //This will call f(int) from B(Polymorphism)
}
 -1
Author: rbl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-01 21:49:24

Bueno, creo que en primer lugar usted no entiende lo que el mecanismo virtual o polimorhismo. Cuando el polimorfismo se logra solo mediante el uso de punteros de objetos. Creo que eres nuevo en c++. Sin usar punteros de objeto, entonces no hay significado de polimorfismo o palabra clave virtual usar puntero de clase base y asignarle los objetos de clase derivados deseados. Entonces llama y pruébalo.

 -6
Author: saravanan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-08 17:34:06