Il polimorfismo ed il binding dinamico si ritrovano nel linguaggio C++ nel concetto di funzioni virtuali. Per illustrarlo adoperiamo il classico esempio di una gerarchia di classi relative a figure geometriche.

#include <iostream.h>

class Figura {
public:
virtual void disegna() {};
}

class Cerchio : Figura {
public:
void disegna() { cout << "cerchio" << endl; };
}

class Triangolo : Figura {
public:
void disegna() { cout << "triangolo" << endl; };
}

class Quadrato : Figura {
public:
void disegna() { cout << "quadrato" << endl; };
}


void main() {
Figura *VettoreDiFigure[3] = { new Cerchio,
new Triangolo, new Quadrato}

for(int i = 0; i < 3; i++)
VettoreDiFigure[i].disegna();
}

La classe base Figura definisce la funzione disegna() come interfaccia comune a tutte le Figure, ottenute come classi derivate. Ciascuna delle classi derivate Cerchio, Triangolo e Quadrato ridefinisce, personalizzandola, la funzione disegna(). La forma di tale metodo è la stessa per ciascun oggetto della lista VettoreDiFigure, un vettore di puntatori a oggetti di tipo Figura definito ed inizializzato nella funzione main(). Nel ciclo viene tuttavia invocata la funzione appropriata a seconda dell'oggetto. Ciò è possibile grazie al legame dinamico (detto anche ritardato) tra l'invocazione del metodo disegna() ed il tipo dell'oggetto su cui viene invocato. Si noti che occorre che la classe base Figura dichiari una funzione fittizia disegna() tramite la parola chiave virtual. Qualora venga esteso successivamente il sistema, introducendo una nuova figura geometrica derivata, non sarà necessario modificare il ciclo for.

 

Funzioni virtuali pure e classi astratte

Se infine si desidera che ciascun oggetto istanza di una figura geometrica appartenga ad uno dei tipi astratti derivati da Figura, o in altri termini che non sia possibile definire oggetti istanze della classe Figura, ma solo delle forme derivate, allora è possibile rendere disegna() una funzione virtuale pura, usando la sintassi:

virtual void disegna() = 0;

L'esistenza di una funzione virtuale pura rende la classe una classe base astratta pura; il suo compito è solo di fungere da interfaccia comune per altre classi derivate. Se una classe derivata non ridefinisce una funzione virtuale pura, è anch'essa una classe astratta pura.