Non capisco qui l'utilità dela classe "shape". Ciop alla fine dei conti noi non andremo sempre a dichiare oggetti specifici ovvero di tipo triangle o square andando ad utilizzare i loro metodi? E allora se non dichiaremo mai nulla di tipo "shape" a che serve dichiararlo come superclasse?Originariamente inviato da MItaly
Quello è un esempio convoluto, perché serve ad aggirare una limitazione del C++. Vedila in maniera più semplice: una classe astratta Shape che implementa un metodo Draw. Dato che è una forma "in generale", non si sa cosa bisogna disegnare, semplicemente si sa che le classi che sono delle Shape dovranno poter essere disegnate.
Dunque,
In questa maniera si possono trattare gli oggetti Shape "in generale": immagina ad esempio una funzione che accetta un parametro di tipo Shape &: può essere qualunque cosa, l'unica cosa che importa alla funzione è di poter usare l'interfaccia "generale" delle Shape (ad esempio il metodo Draw) definita a livello di superclasse. L'implementazione effettiva poi varia da una classe derivata all'altra, ma la funzione non necessita di saperne nulla, chiama Draw su un oggetto che sa essere un generico oggetto derivato da Shape, e magicamente viene chiamata la Draw giusta.codice:class Shape { public: // ... virtual void Draw(Image & Img) = 0; // supponiamo che Image sia un oggetto su cui si può disegnare }; class Square { public: // ... virtual void Draw(Image & Img); // <-- non c'è il "= 0", significa che qui la implementiamo per davvero }; Square::Draw(Image & Img) { // qui si disegna effettivamente il quadrato // ... } class Triangle { public: // ... virtual void Draw(Image & Img); // <-- non c'è il "= 0", significa che qui la implementiamo per davvero }; Triangle::Draw(Image & Img) { // qui si disegna effettivamente il triangolo // ... }