Как компилятор C ++ знает, какую реализацию виртуальной функции вызывать?

Вот пример полиморфизма изhttp://www.cplusplus.com/doc/tutorial/polymorphism.html (отредактировано для удобства чтения):

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

Мой вопрос: как компилятор узнает, что ppoly1 - это Rectangle, а ppoly2 - это треугольник, чтобы он мог вызывать правильную функцию area ()? Это можно выяснить, посмотрев на строку «Polygon * ppoly1 = ▭» и зная, что rect - это Rectangle, но это не сработает во всех случаях, не так ли? Что делать, если вы сделали что-то подобное?

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

Предполагая, что вам разрешен доступ к этой случайной области памяти.

Я бы проверил это, но я не могу на компьютере, на котором я сейчас работаю.

(Надеюсь, я не пропустил что-то очевидное ...)

Ответы на вопрос(6)

Ваш ответ на вопрос