giovedì 14 agosto 2014

Ereditarietà multipla da classi astratte usate come interfacce in C++

Ecco: ho alcuni oggetti che ereditano dalla classe astratta Animale, che implementano la classe astratta Trainatore. E ho anche una classe Motore, completamente diversa quanto a membri, che implementa ugualmente la classe astratta Trainatore.
#include "iostream"
using namespace std;


class Animale{
public:
 virtual void muoviti()=0;
 virtual void verso() =0;
 virtual void azione() =0;
};

class Trainatore{
public:
 virtual void azione()=0;
};

class Cavallo:public Animale,public Trainatore{
 void muoviti(){
  cout << "io galoppo" << endl;
  getchar();
 }
 void verso(){
  cout << "io nitrisco" << endl;
  getchar();
 }
 void azione(){
  cout << "io traino il carro velocemente" << endl;
  getchar();
 }
};

class Bue:public Animale,public Trainatore{
 void muoviti(){
  cout << "io cammino" << endl;
  getchar();
 }
 void verso(){
  cout << "io muggisco" << endl;
  getchar();
 }
 void azione(){
  cout << "io traino il carro lentamente" << endl;
  getchar();
 }
};

class Motore:public Trainatore{
public:
 void rifornimento(){
  cout << "voglio benzina" << endl;
  getchar();
 }
 void azione(){
  cout << "io traino il carro molto velocemente" << endl;
  getchar();
 }
};

void trazione(Trainatore * anim){
 anim->azione();
}

void main(){
 Cavallo Furia;
 Bue Filippo;
 Motore mioMotore;
 trazione(&Furia);
 trazione(&Filippo);
 trazione(&mioMotore);
} 
io traino il carro velocemente

io traino il carro lentamente

io traino il carro molto velocemente


Sì.
Implementano l'interfaccia in quanto istanziano la funzione virtuale pura "azione()". Quindi la funzione che ne mostra i diversi modi di espletare la funzione "azione()" può assumere come parametro un puntatore del tipo della classe astratta Trainatore, che vale pure per un oggetto di una classe completamente diversa da Animale, come Motore.

Nessun commento:

Posta un commento