Questo progetto contiene tre esercizi che dimostrano concetti fondamentali della programmazione orientata agli oggetti in C++.
Questo esercizio dimostra il polimorfismo in C++.
Concetti chiave:
- Classi virtuali: La classe 
Animalha metodi virtuali che permettono il polimorfismo - Override dei metodi: 
DogeCatfanno override del metodomakeSound() - Distruttore virtuale: Necessario per la corretta deallocazione della memoria
 
Classi implementate:
Animal- Classe base con metodi virtualiDog- Eredita da Animal, fa "Woof!"Cat- Eredita da Animal, fa "Meow!"WrongAnimal- Dimostra cosa succede SENZA metodi virtualiWrongCat- Non può fare correttamente l'override perché WrongAnimal non usa virtual
Cosa impari:
Il polimorfismo permette di chiamare il metodo corretto sulla classe derivata anche usando un puntatore alla classe base. Senza virtual, viene sempre chiamato il metodo della classe base.
Compilazione ed esecuzione:
cd ex00
make
./polymorphism
make clean  # pulisce i file .oQuesto esercizio aggiunge la classe Brain e dimostra l'importanza del deep copy.
Concetti chiave:
- Allocazione dinamica: Brain è allocato con 
newnello heap - Deep copy: Il costruttore di copia e l'operatore di assegnazione devono copiare anche il Brain
 - Memory management: È essenziale deallocare il Brain nel distruttore per evitare memory leak
 
Classi implementate:
Brain- Contiene 100 idee (stringhe)Animal- Classe baseDog- Ha un Brain allocato dinamicamenteCat- Ha un Brain allocato dinamicamente
Cosa impari: Quando una classe contiene puntatori a memoria allocata dinamicamente, è fondamentale implementare:
- Costruttore di copia - crea una nuova copia del Brain
 - Operatore di assegnazione - copia il contenuto del Brain
 - Distruttore - dealloca il Brain
 
Senza deep copy, due oggetti condividerebbero lo stesso Brain, causando problemi quando uno viene distrutto.
Compilazione ed esecuzione:
cd ex01
make
./brain
make clean  # pulisce i file .oQuesto esercizio trasforma Animal in una classe astratta.
Concetti chiave:
- Metodo puramente virtuale: 
virtual void makeSound() const = 0; - Classe astratta: Una classe con almeno un metodo puramente virtuale NON può essere istanziata
 - Obbligo di implementazione: Le classi derivate DEVONO implementare tutti i metodi puramente virtuali
 
Classi implementate:
AAnimal- Classe astratta (ha makeSound puramente virtuale)Dog- Deve implementare makeSound() per essere istanziabileCat- Deve implementare makeSound() per essere istanziabileBrain- Come in ex01
Cosa impari: Le classi astratte sono usate come interfacce o classi base che non hanno senso istanziare da sole. Garantiscono che tutte le classi derivate implementino certi metodi, rendendo il codice più robusto e type-safe.
Compilazione ed esecuzione:
cd ex02
make
./abstract
make clean  # pulisce i file .o| Aspetto | ex00 | ex01 | ex02 | 
|---|---|---|---|
| Polimorfismo | ✅ Con virtual | 
✅ Con virtual | 
✅ Con virtual | 
| Brain (memoria dinamica) | ❌ | ✅ | ✅ | 
| Deep copy | ❌ | ✅ | ✅ | 
| Classe astratta | ❌ | ❌ | ✅ | 
| Può istanziare Animal | ✅ | ✅ | ❌ | 
Tutti gli esercizi supportano i seguenti comandi:
make          # Compila il progetto
make clean    # Rimuove i file oggetto (.o)
make fclean   # Rimuove i file oggetto e l'eseguibile
make re       # Ricompila tutto da zero (fclean + all)- Ogni 
newdeve avere un corrispondentedelete - Il distruttore della classe base deve essere 
virtual - Il deep copy è essenziale quando si usano puntatori
 
- Virtual: Permette l'override e il polimorfismo dinamico
 - Non-virtual: Il metodo chiamato dipende dal tipo del puntatore, non dall'oggetto
 
- Non possono essere istanziate direttamente
 - Servono come interfacce o classi base
 - Obbligano le classi derivate a implementare certi metodi
 
Tutti i progetti sono compilati con:
- Compilatore: 
c++ - Standard: 
C++98 - Flag: 
-Wall -Wextra -Werror 
Progetto realizzato per il corso CPP04 della 42 School.