Como o compilador C ++ sabe qual implementação de uma função virtual chamar?

Aqui está um exemplo de polimorfismo dehttp://www.cplusplus.com/doc/tutorial/polymorphism.html (editado para legibilidade):

// 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;
}

Minha pergunta é como o compilador sabe que ppoly1 é um retângulo e que ppoly2 é um triângulo, para que ele possa chamar a função area () correta? Ele poderia descobrir isso olhando para a linha "Polygon * ppoly1 = ▭" e sabendo que rect é um retângulo, mas isso não funcionaria em todos os casos, seria? E se você fizesse algo assim?

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

Supondo que você tenha permissão para acessar essa área aleatória de memória.

Eu testaria isso, mas não posso no computador em que estou no momento.

(Espero não estar faltando algo óbvio ...)

questionAnswers(6)

yourAnswerToTheQuestion