Es hängt davon ab, wo Sie sich im Entwicklungszyklus befinden. Manchmal möchten Sie jedoch beim Skizzieren eines Algorithmus eine Abstraktion über komplexe Blöcke vornehmen, ohne diese sofort zu implementieren.
def full_algo():
init_stuff()
process_stuff()
...
Sie wissen, wie init_stuff
es funktionieren wird, es ist ziemlich einfach in Ihrem Kopf, aber Sie brauchen es nicht sofort, also deklarieren Sie es als leere Funktion. Dadurch kann Ihr Code kompiliert und ausgeführt werden, ohne sich um die wichtigsten Details zu kümmern.
Eine andere Verwendung für freigegebene Anwendungen ist die Verwendung der Vererbung. Angenommen, Sie haben eine große Klasse, die das Verhalten von plattformspezifischem Code definiert. Möglicherweise erhalten Sie eine ähnliche Logik:
init_filesystem();
access_files();
release_filesystem();
Dieser Code funktioniert auf vielen Plattformen, aber einige Plattformen benötigen möglicherweise keine Dateisysteminitialisierung. Dann sieht Ihre Vererbung folgendermaßen aus (virtuell mit = 0 in C ++ bedeutet nur, dass abgeleitete Klassen diese Methoden implementieren MÜSSEN):
class FileSystem{
virtual void init_filesystem() = 0;
virtual void access_files() = 0;
virtual void release_filesystem() = 0;
};
Dann kann eine bestimmte Implementierung dieser Klasse (Schnittstelle) für einige dieser Methoden nichts bewirken. Alternativ könnte die Basisklasse leere Methoden für init / release deklarieren, anstatt sie als virtuell zu deklarieren.
Schließlich (und schändlicherweise) pflegen Sie manchmal eine sehr alte Anwendung. Sie befürchten, dass das Löschen von Methoden zu Problemen führen kann. Dies geschieht, wenn Sie eine komplexe Vererbung haben, die nicht richtig verstanden wird, oder wenn Sie viele Funktionszeiger (Rückrufe) haben. Sie löschen einfach den Code in ihnen, damit sie trotzdem aufgerufen werden, ohne etwas zu beschädigen.