Per essere istanziata, non deve essere una classe generica... Facciamo che sia un rettangolo, che derivi la classe 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(int b, int a){ base=b; altezza=a; } int area(){ return base*altezza/2; } }; void main(){ Rettangolo mioRettangolo(3,4); Triangolo mioTriangolo(3,4); cout << mioRettangolo.area() << endl; cout << mioTriangolo.area() << endl; getchar(); }
12 6E fin qui ci siamo.
Proviamo a usare un puntatore:
#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(int b, int a){ base=b; altezza=a; } int area(){ return base*altezza/2; } }; void main(){ Rettangolo mioRettangolo(3,4); Triangolo mioTriangolo(3,4); Rettangolo *pRect=&mioRettangolo; Triangolo *pTriang = &mioTriangolo; cout << pRect->area() << endl; cout << pTriang->area()<< endl; getchar(); }
12 6Funziona ancora, perché ho creato un puntatore di tipo Rettangolo alla classe base e uno di tipo Triangolo alla classe derivata.
Ma proviamo a creare due puntatori di tipo Rettangolo per ambedue le classi:
#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(int b, int a){
base=b;
altezza=a;
}
int area(){
return base*altezza/2;
}
};
void main(){
Rettangolo mioRettangolo(3,4);
Triangolo mioTriangolo(3,4);
Rettangolo *pRect=&mioRettangolo;
Rettangolo *pTriang = &mioTriangolo;
cout << pRect->area() << endl;
cout << pTriang->area() << endl;
getchar();
}
Ecco, adesso invece è:
12 12Se il puntatore è del tipo della classe base, quando viene chiamato il metodo viene eseguito quello della classe base, come se la classe derivata fosse un rettangolo.
Provo con valori diversi di base e altezza per spiegarmelo meglio.
void main(){ Rettangolo mioRettangolo(3,4); Triangolo mioTriangolo(2,3); Rettangolo *pRect=&mioRettangolo; Rettangolo *pTriang = &mioTriangolo; cout << pRect->area() << endl; cout << pTriang->area() << endl; getchar(); }
12 6Ecco: base e altezza forniti al costruttore della classe derivata sono 2 e 3, e l'area calcolata è 6, come se si trattasse di un rettangolo, non di un triangolo.
Quindi il problema è solo quando si usi un puntatore alla classe base. Usando un puntatore alla classe base, si può far comportare l'oggetto della classe derivata come un oggetto della classe base.
Nessun commento:
Posta un commento