継承をプライベートにすることで、基本的に、BがAから継承するという事実でさえ(まったく)プライベートであり、外部からアクセス/表示することはできません。
それが許可された場合に何が起こるかについての長い議論に入ることなく、単純な事実はそれが許可されていないということです。ベースへのポインタを使用して派生型のオブジェクトを参照する場合は、パブリック継承の使用にかなり悩まされています。
プライベート継承は、必ずしも(または通常でも)リスコフの置換原則に従うことを意図しているわけではありません。パブリック継承は、派生オブジェクトを基本クラスのオブジェクトに置き換えることができ、適切なセマンティクスが引き続き得られることを主張します。しかし、私的継承はそれを主張しません。プライベート継承によって暗示される関係の通常の説明は、「の観点から実装されます」です。
パブリック継承とは、派生クラスが基本クラスのすべての機能を維持し、さらに追加する可能性があることを意味します。プライベート継承は、多かれ少なかれ反対のことを意味することがよくあります。つまり、派生クラスは一般的な基本クラスを使用して、より制限されたインターフェイスで何かを実装します。
たとえば、今のところ、C ++標準ライブラリのコンテナがテンプレートではなく継承を使用して実装されていると仮定しましょう。現在のシステムではstd::deque
、std::vector
はコンテナでありstd::stack
、より制限されたインターフェイスを提供するコンテナアダプタです。テンプレートに基づいているstd::stack
ため、std::deque
またはのいずれかのアダプタとして使用できますstd::vector
。
継承で本質的に同じものを提供したい場合は、おそらくプライベート継承を使用するので、次のようにstd::stack
なります。
class stack : private vector {
};
この場合、我々は間違いないではないユーザーが、私たちを操作できるようにしたいstack
、それがであるかのようにvector
。そうすることで、スタックの期待に違反する可能性があります(たとえば、ユーザーは、意図したとおりの純粋なスタックのような方法ではなく、中央でアイテムを挿入/削除できます)。基本的にvector
スタックを実装するための便利な方法として使用していますが、(たとえば)stack
スタンドアロンの実装を変更した場合(基本クラスに依存しない)、またはの観点から再実装した場合std::deque
、それは望ましくありませんクライアントコードに影響を与えるために-クライアントコードにとって、これは単なるスタックであり、特殊な種類のベクトル(または両端キュー)ではありません。
protected