これは、開発サイクルのどこに立っているかによって異なりますが、アルゴリズムをスケッチするときに、複雑なブロックをすぐに実装せずに抽象化したい場合があります。
def full_algo():
init_stuff()
process_stuff()
...
あなたはどのように機能init_stuff
するかを知っています。頭の中でそれはかなり単純ですが、すぐにそれを本当に必要としないので、あなたはそれを空の関数として宣言します。それはあなたのコードが厄介な詳細を気にすることなくコンパイルして実行できるようにします。
リリース済みアプリケーションのもう1つの用途は、継承を使用する場合です。プラットフォーム固有のコードの動作を定義する大きなクラスがあるとします。あなたはこれに似たロジックで終わるかもしれません:
init_filesystem();
access_files();
release_filesystem();
このコードは多くのプラットフォームで機能しますが、一部のプラットフォームではファイルシステムの初期化が不要な場合があります。次に、継承は次のようになります(C ++での仮想的な= 0は、派生クラスがこれらのメソッドを実装する必要があることを意味します):
class FileSystem{
virtual void init_filesystem() = 0;
virtual void access_files() = 0;
virtual void release_filesystem() = 0;
};
次に、このクラス(インターフェース)の特定の実装は、これらのメソッドの一部に対して何もしない場合があります。あるいは、基本クラスは、init / releaseの仮想メソッドを宣言する代わりに、空のメソッドを宣言することもできます。
最後に(そして恥ずかしいことに)、非常に古いアプリケーションを維持することがあります。メソッドを削除すると問題が発生することを恐れています。これは、適切に理解されていない複雑な継承がある場合、または多くの関数ポインター(コールバック)がある場合に発生します。それらの中のコードを削除するだけで、何も壊さずに呼び出されます。