5. Classi e Funzioni Virtuali



5.2 Funzioni Virtuali

Le Funzioni Virtuali nascono per superare i problemi di ambiguità che sorgono in una gerarchia di classi in cui la classe base e le classi derivate hanno funzioni membro omonime e gli oggetti istanziati sono riferiti tramite puntatori.
Vediamo subito un esempio:

class Aereo
{
  int velmax;
  public:
  Aereo();
  ~Aereo();
  void Caratteristiche();
}

Aereo::Aereo()
{
  velmax=1000;
}

void Aereo::Caratteristiche()
{
  cout << "Aereo con velocità massima di "<< velmax << " km/h."<
L'uscita che si ottiene a video è la seguente:
Aereo con velocità massima di 1000 km/h.
Aereo Militare equipaggiato con 10 bombe.
Fin qui nulla di nuovo. Se, però, in questa gerarchia di classi si introducono i puntatori, il discorso cambia. Supponendo di avere il main seguente:
int main()
{
  Aereo *pAereo;
  AereoMilitare F116;

  pAereo = &F116;  //Casting Implicito legale!
  pAereo->Caratteristiche();

  return 0;
}
l'uscita a video risulta la seguente:
Aereo con velocità massima di 1000 km/h.
in quanto il compilatore elimina ogni ambiguità al compile-time, chiamando la funzione membro dell'oggetto per il quale è stato definito il puntatore (in questo caso, l'Aereo).
Più in generale, se si definisce un puntatore alla classe base e successivamente lo si assegna ad una classe derivata (casting implicito), accade che il compilatore chiama sempre la funzione omonima della classe base (per la quale era stato definito il puntatore).
Per evitare ciò occorre definire la funzione "virtual": in questo modo la scelta su quale funzione membro chiamare viene fatta al run-time (si parla di binding dinamico).
Per fare ciò, la sintassi C++ prevede la keyword virtual premessa al prototipo della funzione membro nella classe base, ossia:
virtual tipo nomefunzione(lista parametri);
Nel caso in esame, occorre definire la classe Aereo nel modo seguente:
class Aereo
{
  int velmax;
  public:
  Aereo();
  ~Aereo();
  virtual void Caratteristiche();
}

int main()
{
  Aereo *pAereo;
  AereoMilitare F116;

  pAereo = &F116;  //Casting Implicito legale!
  pAereo->Caratteristiche();

  return 0;
}
Adesso, l'uscita a video sarà quella attesa:
Aereo Militare equipaggiato con 10 bombe.

dx
Precedente
back
Home page
dx
Successivo