Si quieres comportamiento modificado en la clase derivada, pero quieres que el metodo invocado reaccione de acuerdo al tipo de objeto, tienes que definir en la clase base el metodo (o los metodos) como virtuales.
Si tuvieras una funcion
Código C++:
Ver originalvoid f( Vehiculo* pvehiculo ) {
pvehiculo->metodo_virtual();
}
esta funcion trabajaria tanto con vehiculos como con derivados de este, y se invocaría siempre el metodo mas "cercano" (en el caso de los derivados, el metodo definido en esa particular clase).
El no definirlo virtual hará que la función mostrada siempre invoque el método de la clase base, y necesitarías otra(s) función(es)para invocar los derivados.
Entonces: Lo recomendable es que definas los métodos a redefinir como virtuales en la clase base.