#include "iostream" using namespace std; class Rettangolo{ protected: int base,altezza; public: Rettangolo(){} Rettangolo(int b, int a){ base=b; altezza=a; } int area(){ return base*altezza; } }; class Triangolo:public Rettangolo{ public: Triangolo(){} Triangolo(int b, int a){ base=b; altezza=a; } int area(){ return base*altezza/2; } }; void main(){ Triangolo mioTriangolo(3,4); Triangolo vrbl; vrbl=mioTriangolo; cout << vrbl.area() << endl; getchar(); }Ho creato una variabile Triangolo e vi attribuisco il valore dell'oggetto mioTriangolo che ho creato istanziando la classe.
Vediamo come si comporta.
6Si comporta come un triangolo.
Adesso creo una variabile Rettangolo e vi attribuisco il valore dell'oggetto mioTriangolo.
void main(){ Triangolo mioTriangolo(3,4); Rettangolo vrbl; vrbl=mioTriangolo; cout << vrbl.area() << endl; getchar(); }
12Si comporta come un rettangolo.
Rendiamo virtuale la funzione nella classe base.
class Rettangolo{ protected: int base,altezza; public: Rettangolo(){} Rettangolo(int b, int a){ base=b; altezza=a; } virtual int area(){ return base*altezza; } };
Creiamo di nuovo la variabile, prima di tipo Triangolo e dopo di tipo Rettangolo.
void main(){ Triangolo mioTriangolo(3,4); Triangolo vrbl; vrbl=mioTriangolo; cout << vrbl.area() << endl; getchar(); }
6Si comporta come un triangolo.
Ora creiamo una variabile Rettangolo:
void main(){ Triangolo mioTriangolo(3,4); Rettangolo vrbl; vrbl=mioTriangolo; cout << vrbl.area() << endl; getchar(); }
12Si comporta come un rettangolo.
Dunque, se la funzione non è virtuale, se si attribuisce il valore di un oggetto della classe derivata a una variabile del tipo della classe derivata, la variabile si comporta come oggetto della classe derivata. Se la funzione è virtuale, se si attribuisce il valore di un oggetto della classe derivata a una variabile del tipo della classe base la variabile si comporta come un oggetto della classe base.
Nessun commento:
Posta un commento