Sobes.tech
Junior

Cosa sono il sovraccarico e la ridefinizione dei metodi in C++?

sobes.tech AI

Risposta dell'AI

Sovraccarico di metodi (Method Overloading):

  • Permette di avere più metodi con lo stesso nome in una classe.
  • Si differenziano per firma (numero e/o tipi di parametri).
  • Il tipo di ritorno non partecipa alla definizione della firma per l'overloading.
  • La scelta di un metodo specifico è determinata dal compilatore in base ai tipi di argomenti durante la chiamata (binding statico).
class MyClass {
public:
    void print(int a) {
        // Stampa di un numero intero
    }

    void print(double d) {
        // Stampa di un numero a virgola mobile
    }

    void print(int a, int b) {
        // Stampa di due numeri interi
    }
};

Sovrascrittura di metodi (Method Overriding):

  • Permette alla classe derivata di fornire un'implementazione specifica di un metodo già definito nella classe base.
  • Il metodo nella classe derivata deve avere la stessa firma (nome, numero e tipi di parametri) e lo stesso tipo di ritorno (o un tipo di ritorno covariante).
  • Si usa con funzioni virtuali (virtual) per implementare il polimorfismo.
  • La scelta dell'implementazione concreta del metodo è determinata in fase di esecuzione (binding dinamico), a seconda del tipo reale dell'oggetto.
class Base {
public:
    virtual void display() {
        // Implementazione nella classe base
    }
};

class Derived : public Base {
public:
    void display() override { // La parola chiave override (a partire da C++11) aiuta a evitare errori
        // Implementazione specifica nella classe derivata
    }
};

Differenze principali:

Caratteristica Sovraccarico di metodi Sovrascrittura di metodi
Luogo di applicazione In una stessa classe In classi base e derivate
Nome del metodo Stesso Stesso
Firma del metodo Diversa Uguale
Meccanismo di scelta Binding statico (compilazione) Binding dinamico (esecuzione)
Usato con Funzioni normali Funzioni virtuali
Obiettivo Azioni diverse per tipi diversi Implementazione specifica nell'eredità