Aquí es un ejemplo de polimorfismo de http://www.cplusplus.com/doc/tutorial/polymorphism.html (editado para facilitar la lectura):¿Cómo sabe el compilador de C++ qué implementación de una función virtual llamar?
// abstract base class
#include <iostream>
using namespace std;
class Polygon {
protected:
int width;
int height;
public:
void set_values(int a, int b) { width = a; height = b; }
virtual int area(void) =0;
};
class Rectangle: public Polygon {
public:
int area(void) { return width * height; }
};
class Triangle: public Polygon {
public:
int area(void) { return width * height/2; }
};
int main() {
Rectangle rect;
Triangle trgl;
Polygon * ppoly1 = ▭
Polygon * ppoly2 = &trgl;
ppoly1->set_values (4,5);
ppoly2->set_values (4,5);
cout << ppoly1->area() << endl; // outputs 20
cout << ppoly2->area() << endl; // outputs 10
return 0;
}
Mi pregunta es ¿cómo sabe el compilador que ppoly1 es un rectángulo y que ppoly2 es un triángulo, de modo que pueda llamar a la correcta función area()? Podría averiguarlo mirando la línea "Polygon * ppoly1 = ▭" y sabiendo que rect es un Rectángulo, pero eso no funcionaría en todos los casos, ¿verdad? ¿Qué pasa si hiciste algo como esto?
cout << ((Polygon *)0x12345678)->area() << endl;
Suponiendo que tiene permiso para acceder a ese área aleatoria de memoria.
Lo probaría pero no puedo en la computadora en la que estoy en este momento.
(espero que no me falta algo obvio ...)
Offtopic: ¿Por qué no votar por las otras personas que dedicaron tiempo a escribir respuestas útiles para usted? –