C++でのpublic
、private
、protected
の継承の違いは何ですか?SOに掲載されている質問は、すべて特定のケースを扱ったものです。
その質問に答えるために、まずメンバーのアクセサを私の言葉で説明したいと思います。すでにご存知の方は、「next:」の見出しに読み飛ばしてください。
私が知っているアクセサは3つあります。public、
protected、
private`です。
let:
class Base {
public:
int publicMember;
protected:
int protectedMember;
private:
int privateMember;
};
Base
を認識しているすべてのものは、Base
が publicMember
を含んでいることも認識しています。Base
が protectedMember
を含んでいることを認識しているのは、子供(とその子供)だけです。Base
以外のものは privateMember
を認識していません。認識している」というのは、「存在を認識している、つまりアクセスできる」という意味です。
public、private、protectedの継承でも同じことが言えます。クラスBase
と、Base
を継承したクラスChild
を考えてみましょう。
public
の場合、Base
と Child
を認識しているすべてのものは、Child
が Base
を継承していることも認識しています。protected
の場合、Child
とその子供だけが Base
を継承していることを認識します。private
の場合、Child
以外の人は継承を認識しません。これは、ベースクラスのパブリックメンバーが派生クラスからどのように公開されるかに関係します。
litbが指摘するように、パブリックな継承は、ほとんどのプログラミング言語で見られる伝統的な継承です。つまり、「IS-A」の関係をモデル化したものです。プライベート継承は、C++に特有のもので、「IMPLEMENTED IN TERMS OF」の関係です。つまり、派生クラスでパブリック・インターフェイスを 使用 したいが、派生クラスのユーザーがそのインターフェイスにアクセスできないようにしたいのです。このような場合、基底クラスを集約すべきだと多くの人が主張しています。つまり、基底クラスをプライベートな基底として持つ代わりに、基底クラスの機能を再利用するために derived のメンバにするのです。