Originariamente inviato da Neptune
[...]
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,
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
    // ...
}
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.