#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