¿Cómo sabe el compilador de C ++ a qué implementación de una función virtual llamar?

Aquí hay un ejemplo de polimorfismo dehttp://www.cplusplus.com/doc/tutorial/polymorphism.html (editado para legibilidad):

// 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 = &rect;
    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, para que pueda llamar a la función area () correcta? Podría descubrirlo mirando la línea "Polygon * ppoly1 = ▭" y sabiendo que rect es un Rectángulo, pero eso no funcionaría en todos los casos, ¿verdad? ¿Y si hicieras algo como esto?

cout << ((Polygon *)0x12345678)->area() << endl;

Suponiendo que tienes permiso para acceder a esa área aleatoria de la memoria.

Lo probaría pero no puedo con la computadora en la que estoy encendido en este momento.

(Espero que no me falte algo obvio ...)

Respuestas a la pregunta(6)

Su respuesta a la pregunta