Woher weiß der C ++ - Compiler, welche Implementierung einer virtuellen Funktion aufgerufen werden soll?

Hier ist ein Beispiel für Polymorphismus aushttp://www.cplusplus.com/doc/tutorial/polymorphism.html (zur besseren Lesbarkeit bearbeitet):

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

Meine Frage ist, woher der Compiler weiß, dass ppoly1 ein Rechteck und ppoly2 ein Dreieck ist, so dass er die richtige area () -Funktion aufrufen kann? Das könnte man herausfinden, indem man sich die Zeile "Polygon * ppoly1 = ▭" ansieht und weiß, dass rect ein Rechteck ist, aber das würde nicht in allen Fällen funktionieren, oder? Was ist, wenn Sie so etwas getan haben?

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

Angenommen, Sie dürfen auf diesen zufälligen Speicherbereich zugreifen.

Ich würde das testen, aber ich kann nicht an dem Computer arbeiten, an dem ich gerade bin.

(Ich hoffe, ich verpasse nicht etwas offensichtliches ...)

Antworten auf die Frage(6)

Ihre Antwort auf die Frage