Вот пример полиморфизма из 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 = ▭
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 является прямоугольником, а ppoly2 - треугольником, чтобы он мог вызывать правильную функцию area ()? Это можно выяснить, посмотрев на «Polygon * ppoly1 = & rect;» и зная, что rect это Rectangle, но это не сработает во всех случаях, не так ли? Что делать, если вы сделали что-то подобное?
cout << ((Polygon *)0x12345678)->area() << endl;
Предполагая, что вам разрешен доступ к этой произвольной области памяти.
Я бы проверил это, но не могу на компьютере, на котором я сейчас работаю.
(Надеюсь, я не упускаю ничего очевидного ...)