Dipende da dove ti trovi nel ciclo di sviluppo, ma a volte quando schizzi un algoritmo, vuoi fare astrazione su blocchi complessi senza implementarli immediatamente.
def full_algo():
init_stuff()
process_stuff()
...
Sai come init_stuff
funzionerà, è piuttosto semplice nella tua testa ma non ne hai davvero bisogno subito, quindi lo dichiari come una funzione vuota. Permetterà al tuo codice di essere compilato ed eseguito senza preoccuparsi dei dettagli cruenti.
Un altro uso per le applicazioni rilasciate è quando si utilizza l'ereditarietà. Supponiamo di avere una grande classe che definisce il comportamento del codice specifico della piattaforma. Potresti finire con una logica simile a questa:
init_filesystem();
access_files();
release_filesystem();
Questo codice funzionerà su molte piattaforme, ma alcune piattaforme potrebbero non richiedere l'inizializzazione del filesystem. Quindi la tua eredità sarà simile a questa (virtuale con = 0 in C ++ significa solo che le classi derivate DEVONO implementare quei metodi):
class FileSystem{
virtual void init_filesystem() = 0;
virtual void access_files() = 0;
virtual void release_filesystem() = 0;
};
Quindi un'implementazione particolare di questa classe (interfaccia) potrebbe non fare nulla per alcuni di questi metodi. In alternativa, la classe base potrebbe dichiarare metodi vuoti per init / release invece di dichiararli virtuali.
Finalmente (e vergognosamente), a volte mantieni un'applicazione molto vecchia. Temi che l'eliminazione dei metodi rompa le cose. Ciò accade quando si ha un'eredità complessa che non è stata compresa correttamente o quando si hanno molti puntatori a funzioni (callback). Basta eliminare il codice al loro interno in modo che vengano chiamati comunque senza interrompere nulla.