ejemplos - manual completo de c++ pdf
Herencia de C++ y anulaciĆ³n de funciones (3)
El término utilizado para describir esto es "ocultar", en lugar de "anular". Un miembro de una clase derivada, de forma predeterminada, hará inaccesibles a los miembros de las clases base con el mismo nombre, tengan o no la misma firma. Si desea acceder a los miembros de la clase base, puede incluirlos en la clase derivada con una declaración de using
. En este caso, agregue lo siguiente a la class Y
:
using X::spray;
En C ++, ¿una función miembro de una clase base será anulada por su función de clase derivada del mismo nombre, incluso si su prototipo (recuento de parámetros, tipo y constness) es 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.
#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&)
Eso es lo que se llama ''ocultar'': Y::spray
oculta X::spray
. Agregar usando directiva:
class Y : public X
{
public:
using X::spray;
// ...
};
Las clases son ámbitos y un ámbito de clase está anidado en su elemento primario. Tiene exactamente el mismo comportamiento con otros ámbitos anidados (espacios de nombres, bloques).
Lo que sucede es que cuando la búsqueda de nombres busca la definición de un nombre, se ve en el espacio de nombres actual, luego en el espacio de nombres englobing y así sucesivamente hasta que encuentre una definición; la búsqueda se detiene (es decir, sin tener en cuenta las complicaciones introducidas por el argumento búsqueda de nombre dependiente - la parte de las reglas que permite utilizar una función definida en el espacio de nombres de uno de sus argumentos).