En C++, ¿se invalidará una función miembro de una clase base por su función de clase derivada del mismo nombre, aunque su prototipo (recuento de parámetros, tipo y constness) sea diferente? Supongo que es una pregunta tonta, ya que muchos sitios web dicen que el prototipo de función debe ser el mismo para que eso suceda; pero ¿por qué el código siguiente no se compila? Es un caso muy simple de herencia, creo.Anulación de función y dominio C++
#include <iostream>
using std::cout;
using std::endl;
class A {};
class B {};
class X
{
public:
void spray(A&)
{
cout << "Class A" << endl;
}
};
class Y : public X
{
public:
void spray(B&)
{
cout << "Class B" << endl;
}
};
int main()
{
A a;
B b;
Y y;
y.spray(a);
y.spray(b);
return 0;
}
GCC lanza
error: no matching function for call to `Y::spray(A&)'
note: candidates are: void Y::spray(B&)
Obtuve las preguntas frecuentes de C++ que dicen sobre el mismo problema, para una explicación detallada si alguien lo necesita :) http://www.parashift.com/c++faq-lite/strange-inheritance.html#faq- 23.9 – legends2k
Es un poco peligroso decir que las firmas deberían ser las mismas. Las firmas son la base para el nombre de manipulación y vinculación. Dos miembros de diferentes clases siempre tienen diferentes firmas, incluso si una anula la otra. Es mejor decir "los mismos tipos de parámetros, nombres y constness", creo, incluso si es más largo decirlo. –
@litb: ¡Gracias por aclarar! Supongo que 'prototipo' es la palabra adecuada aquí, la he cambiado en la pregunta :) – legends2k