Ecco un esempio di polimorfismo da http://www.cplusplus.com/doc/tutorial/polymorphism.html (a cura per migliorare la leggibilità):Come fa il compilatore C++ a sapere quale implementazione di una funzione virtuale chiamare?
// 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;
}
mia domanda è come fa il compilatore sa che ppoly1 è un rettangolo e che ppoly2 è un triangolo, in modo che possa chiamare la corretta area() funzione? Potrebbe scoprirlo guardando la riga "Polygon * ppoly1 = ▭" e sapendo che il rect è un rettangolo, ma non funzionerebbe in tutti i casi, vero? E se facessi qualcosa del genere?
cout << ((Polygon *)0x12345678)->area() << endl;
Supponendo che si è permesso di accedere a quella zona casuale di memoria.
Vorrei testarlo ma non posso sul computer in cui mi trovo al momento.
(spero non mi manca qualcosa di ovvio ...)
Offtopic: Perché non votare le altre persone che hanno speso tempo a scrivere risposte utili per te? –