1)
codice:
virtual void calcola_area();
In questo caso devi fornire un'implementazione del metodo in sezione_type, in quanto potresti usare sezione_type come classe a se stante.
codice:
virtual void calcola_area()=0;
In questo caso sei obbligato a dare un'implementazione della funzione nella classe derivata, in quanto il metodo è astratto.
2)
Si, in quel modo verrebbe richiamato sempre il metodo della classe base.
Ricapitolando:
codice:
void calcola_area(); // richiama sempre metodo classe base a prescindere dalle derivate (static binding)
virtual void calcola_area(); // richiama metodo classe derivata solo se presente. Se no metodo classe base (dynamic binding)
virtual void calcola_area()=0; // occorre definire il metodo nelle classi derivate, altrimenti non compila. (dynamic binding)
3) Le classi basi devono avere il distruttore dichiarato virtual, altrimenti il distruttore delle derivate non sarà invocato.