1101

工学系大学院生の雑記。

非仮想関数・仮想関数・純粋仮想関数の使い分け

書籍『Effective C++』を読んで腑に落ちたので覚え書き。
以下は全てC++を前提に書いています。

非仮想関数・仮想関数・純粋仮想関数の使い分け

クラスをpublic継承する場合、何を継承するかによって2つのパターンに大別されます。
関数の「インタフェース」を継承するか、「実装」を継承するかです。
非仮想関数・仮想関数・純粋仮想関数を使い分けることで、それぞれを表現することができます。

純粋仮想関数

派生クラスにインタフェースのみを継承させるために用います。
つまりメンバ関数の宣言のみ基底クラスで行い、実装は派生クラスで行われます。

仮想関数

純粋仮想関数とは異なり、インタフェースだけでなくデフォルトの実装も継承されます。
再実装を派生クラスで行うこともできますが、
特に変更する必要性がなければ基底クラスの実装をそのまま派生クラスで利用できます。

非仮想関数

非仮想関数は、どの派生クラスにおいても動作が変わらないことを規定します。
宣言も実装も基底クラスで行われ、派生クラスでその実装を変更することはできません。

感想

正直今まで非仮想関数・仮想関数・純粋仮想関数の使い分け方がイマイチ分からず、
『経験の浅いプログラマがしやすい2つの間違い』のひとつとして書籍でも取り上げられているように、
「すべての関数を非仮想に宣言」していました...。
ひとつずつちゃんと理解して、早く良いプログラムが書けるようになりたいです。