2010-11-24 21 views
8

Duplicar posible:
overloaded functions are hidden in derived class¿Por qué obtengo ninguna función coincidente cuando heredo esta función

tengo Clase A y Clase B (subclase de A)

Clase A tiene la función

virtual void foo(int, int); 
virtual void foo(int, int, int); 

cuando intento hacer

Clase B con función

virtual void foo(int, int); 

Cuando intento llamar a foo (int, int, int) con la clase el compilador no me deja porque dice

no matching function for foo(int,int,int) 
candidate is foo(int,int); 
+0

Publique más código. –

+0

u otro engañado potencial es http://stackoverflow.com/questions/4146499/why-does-a-virtual-function-get-hidden. No estoy seguro de si el interlocutor espera que las funciones sean virtuales, pero no hace ninguna diferencia. –

Respuesta

9

El motivo tiene que ver con la forma en que C++ nombra la resolución de búsqueda y sobrecarga. C++ comenzará en el tipo de expresión y buscará hacia arriba hasta que encuentre un miembro que coincida con el nombre especificado. Entonces solo considerará las sobrecargas del miembro con ese nombre en el tipo descubierto. Por lo tanto, en este escenario solo considera los métodos foo declarados en B y, por lo tanto, no encuentra la sobrecarga.

El remedio más fácil es agregar using A::foo en class B para forzar al compilador a considerar esas sobrecargas también.

class B : public A { 
    using A::foo; 
    virtual void foo(int, int); 
}; 
2

La anulación en la clase B oculta los métodos de la clase A con el mismo nombre. (¿Tiene advertencias del compilador sobre? La mayoría de los compiladores advierten sobre los métodos virtuales ocultos.)

Para evitar esto, añadir

using A::foo; 

a la clase B (en cualquiera de public/protected/private sección es apropiado).

1

Uso

B b; 
b.A::foo(1,2,3); 

por ejemplo.

Cuestiones relacionadas