継承の使い方

先日の多態について少し補足。

継承を使うときの考え方として、"実装の継承"と"インタフェースの継承"があります。
前者は再利用するための継承、後者は再利用されるための継承です。
ところが、C++に限らず、一般的な継承の仕組みは、実装とインタフェースの両方を継承してしまい、クラスの肥大化や冗長化を招きやすくなっています(JavaC#にはinterfaceが、C++には純粋仮想関数があり、一応インタフェースのみの継承は可能にはなっています)。
これを避けるために、NVIイディオムやprotected non-virtual デストラクタを使うわけですが、実のところ、継承を使わないほうが(コード量は多くても)、スマートなデザインになることが多々あります。
事実、既存の実装を再利用するだけならばコンポジョン(+pimpl)だけで通常は十分ですので、インタフェースを継承する必要が無ければ(特にpublic)継承は使わないようにするべきです。