Yo pensaba que si no poniamos virtual, la funcion de la clase derivada quedaba oculta.
De hecho, si queda oculta, pero eso sucede cuando utilizamos
apuntadores genericos para acceder a las clases padre/hijo, es decir,
apuntadores de tipo de la clase base.
Mas claro, tomado tus clases de ejemplo, prueba lo siguiente, primero sin virtual, y despues añadele virtual, y entonces si veras la difeencia:
#include <iostream>
using namespace std;
class Base{
public:
void func(int a)
{
cout << "Estoy en la clase Base" << endl;
}
};
class Derivada : public Base{
public:
void func(int a)
{
cout << "Estoy en la clase Derivada" << endl;
}
};
int main()
{
Base *a[2];
a[0] = new Base();
a[1] = new Derivada();
for (int i = 0; i < 2; i++)
{
a[i]->func(0);
}
for (int i = 0; i < 2; i++)
{
delete a[i];
}
return 0;
}
Mas informacion:
http://es.wikipedia.org/wiki/Funci%C3%B3n_virtualSaludos