No estás haciendo las cosas bien.
La idea de tirar de herencia y polimorfismo es que se puedan usar diferentes tipos de objetos sin importar su origen concreto.
En tu caso, lo lógico sería que la función "ecuacion" tuviese un método virtual llamado "calcular", que devolviese un double y no recibiese parámetros... en la clase "ecuacion" este método debería ser virtual puro, sin embargo, las diferentes ecuaciones que heredasen de "ecuacion" deben implementar este método para realizar cada una el cálculo que le corresponda:
Código C++:
Ver originalclass Ecuacion
{
public:
virtual double calcular( double x ) const =0;
};
class EcuacionLineal : public Ecuacion
{
public:
virtual double calcular( double x) const override
{
return getA()*x+getB();
}
};
int main( )
{
Ecuacion* ecuacion = new EcuacionLineal( );
ecuacion->setA( 10.0 );
ecuacion->setB( 12.5 );
std::cout<< ecuacion->calcular( 3.5 );
}
Si en un diseño se da el caso de que necesitas conocer el tipo concreto de clase hija en la clase padre, entonces es que estás haciendo mal las cosas.
PD.: "override" es una palabra clave nueva en el estándar C++11 si tu compilador no la soporta puedes quitarla sin ningún problema... su cometido es dar un error de compilación si la función en cuestión no sobreescribe la función de una clase padre.
Un saludo.