Si deseamos una llamada polimórfica, en C++ debemos marcar el método como 'virtual':
class Figura {
public:
virtual double calcularArea()
{ return 0; }
};
De esta forma, las llamadas funcionan correctamente.
En realidad, no precisamos de un cuerpo para este método, ya que, al fin y al cabo, donde realmente sabremos cómo calcular el área es en las figuras Rectángulo y Círculo.
Podemos solventarlo así:
class Figura {
public:
virtual double calcularArea() = 0;
};
Además, ahora obtenemos dos beneficios extra: no es posible crear objetos de la clase Figura (lo cuál, es lógico, por otra parte), y al ser el método abstracto (no tiene cuerpo), obligatoriamente las clases derivadas deben redefinirlo (lo cuál es precisamente lo que deseamos).
En realidad, el polimorfismo está íntimamente ligado a la ligadura tardía. No puede haber una sin otra, ni la otra sin la una.