Skip to content

Interfacce: Metodi Puramente Virtuali e Distruttori

Se l’intenzione è quella di creare un’Interfaccia formale (un contratto che imponga alle classi derivate di implementare tassativamente certi metodi), devi trasformare il tuo metodo virtual in un metodo puramente virtuale (pure virtual method).

Per dichiarare un metodo puramente virtuale, si aggiunge un misterioso e brutale suffisso = 0 alla fine della firma del metodo nella classe Base, e non si fornisce alcuna implementazione.

Una classe che possiede almeno un metodo = 0 diviene immediatamente una Pure-Virtual Class (Classe astratta), ovvero una classe che non può essere istanziata direttamente. Serve unicamente come scafo per derivarne nuove classi (le sue Implementazioni).

Un’implementazione (la classe derivata) deve sovrascrivere tutti i metodi puramente virtuali dell’interfaccia, altrimenti il compilatore la considererà a sua volta una classe astratta.

Quando programmi usando il polimorfismo, spesso ti troverai a gestire istanze derivate (allocate dinamicamente) attraverso puntatori alla classe base. Cosa accade quando chiami delete su un puntatore alla classe base?

Se il distruttore della classe base non è marcato come virtual, il C++ invocherà solo ed esclusivamente il distruttore della classe Base, tralasciando completamente la demolizione della classe Derivata sottostante. Le risorse della derivata andranno orrendamente in Memory Leak.

Soluzione di Vitale Importanza:

Aggiungi SEMPRE un distruttore virtuale di default (virtual ~NomeClasse() = default;) a qualsiasi classe che funge da Interfaccia o da Base per altre classi.