Wie funktioniert die C++ - compiler wissen, welche Implementierung einer virtuellen Funktion aufrufen?

Hier ist ein Beispiel des Polymorphismus von http://www.cplusplus.com/doc/tutorial/polymorphism.html (zur besseren Lesbarkeit umgebrochen):

//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, wie der compiler wissen, dass ppoly1 ist ein Rechteck, und dass ppoly2 ist ein Dreieck, so dass Sie es nennen können, die richtige area () - Funktion? Könnte es herausfinden, indem man die "Polygon * ppoly1 =

" zu haben und zu wissen, dass ein Rechteck ist ein Rechteck, aber nicht in allen Fällen funktionieren, oder? Was ist, wenn Sie so etwas Tat?

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

Davon aus, dass Sie erlaubt, dass der Zugang zufälligen Speicherbereich.

Ich würde das ausprobieren, aber ich kann nicht auf dem computer ich bin mir im moment.

(Ich hoffe, ich bin nicht etwas fehlt offensichtlich...)

  • Offtopic: Warum nicht abstimmen, bis die anderen Menschen, die verbrachte Zeit mit dem schreiben hilfreiche Antworten für Sie?
InformationsquelleAutor Jeremy Ruten | 2008-10-14
Schreibe einen Kommentar