giovedì 10 luglio 2014

Studio delle funzioni virtuali con le variabili oggetto.

Ho due classi, una classe base Rettangolo e una classe derivata Triangolo.
#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.

6


Si 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();
}
12


Si 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();
}
6


Si comporta come un triangolo.

Ora creiamo una variabile Rettangolo:
void main(){
	Triangolo mioTriangolo(3,4);
	Rettangolo vrbl;
	vrbl=mioTriangolo;
	cout << vrbl.area() << endl;
	

	getchar();
}
12


Si 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