Estoy tratando de heredar dos métodos igualmente nombrados con diferentes listas de parámetros a una clase derivada. Uno de ellos es virtual y está anulado en la clase derivada, el otro no es virtual. Al hacerlo, obtengo un error de compilación al intentar acceder al método no virtual de la clase base desde un objeto de clase derivado.C++: heredar el método no virtual sobrecargado y el método virtual con el mismo nombre causa el problema
Aquí es el fragmento de código
class Base {
public:
void f() {
cout << "[Base::f()]" << endl;
}
virtual void f(int arg) {
cout << "[Base::f(" << arg << ")]" << endl;
}
};
class Deriv : public Base {
public:
virtual void f(int arg) {
cout << "[Deriv::f(" << arg << ")]" << endl;
}
};
int main() {
Deriv d;
d.f(-1);
d.f(); // <<-- compile error
return 0;
}
que produce el siguiente error de compilación:
error: no matching function for call to ‘Deriv::f()’
note: candidates are: virtual void Deriv::f(int)
no soy un experto en C++, pero hasta ahora piensa que es justo haciendo la suposición que los métodos de los miembros se pueden distinguir por completo por sus firmas. Por lo tanto, el método no virtual Base :: f() no debe anularse y debe permanecer accesible. ¿Estoy equivocado con esto?
Éstos son algunos comentarios interesantes/adicionales en que:
-
- el método predominante Deriv :: f (int arg) podría ser no virtual, así; el error se produce en ambos sentidos
- desaparece el error/se puede evitar ...
-
... echando el objeto Deriv a la clase Base
... cuando no esté anulando Base :: f (int arg) en Deriv
... agregando el comando "Base :: f;" a la parte pública de Deriv
Por lo tanto, puesto que ya saben cómo evitar este error de compilación, estoy interesado principalmente en qué ocurre este error! Por favor, ayúdame a arrojar luz sobre eso ...
Gracias en advanvce! Emme
Cuando dices "... al agregar el comando" Base :: f; "a la parte pública de Deriv", te refieres a 'usar Base :: f;'? – Tomaka17
posible duplicado de [Anulando la función sobrecargada de una base en C++] (http://stackoverflow.com/questions/888235/overriding-a-bases-overloaded-function-in-c) –
@ Tomaka17: No, me refiero exactamente : ponga la línea Base :: f; a la clase. Pero obviamente esto es lo mismo que el comando "usar ...". – Emme