3

誰かがC++のプライベート/保護された継承が何のためにあるのか、そしてそれがどのような問題を解決することを意図しているのか説明できますか?

class Bar { };
class Foo : private Bar { };

私はすでにこの質問を見ましたが、それ何であるかはまだわかりません。ましてや、いつ使用すべきかは言うまでもありません。

(Java / C#または同様の言語の機能との比較も役立つ可能性があります。)

4

4 に答える 4

5

プライベート継承モデルは「の期間で実装されます」。意味は「has-a」に似ています。違いは次のとおりです。

  1. プライベート継承を使用すると、ラッパーを作成する必要はありません(怠惰なプログラマーに適しています)

  2. 「has-a」を使用すると、より適切に制御できます。必要に応じて、インターフェースのサブセットのみを公開したり、メソッド名を変更したりできます。

  3. プライベート継承は例外の安全性を困難にします。詳細については、例外的なC++を参照してください。

  4. 基本クラスの保護されたメンバーを使用する場合は、プライベート継承が本当に必要です。

  5. 時々、プライベート継承がミックスインクラスで使用されます(効果的なc ++メモリ管理の章)

私の個人的な好みは、一般的な目的で「has-a」を使用することです。他のオプションを除外した直後に、プライベート継承を使用します。

于 2011-11-26T20:42:43.817 に答える
2

プライベート継承を理解するには、最初にパブリック継承を理解する必要があります。

次の場合:

class Base
{
public:
  void SomeFunc();
};

class Pub : public class Base {};

これは、以下が許可されることを意味します。

Pub aPub;
Base &basePart = aPub;

派生クラスを取得して、基本クラスへの参照(またはポインター)を取得できます。これを行うこともできます:

Pub aPub;
aPub.SomeFunc();

で公開されていたものBaseはで公開されていPubます。

パブリック継承とは、どこにいても、ドリブンクラスの基本クラスコンポーネントにアクセスできることを意味します。

プライベート継承は少し異なります:

class Priv : private class Base {};

Priv aPriv;
Base &basePart = aPriv;

その最後の行は一般的に機能しません。プライベート継承とは、この操作を実行できる関数とクラスがの直接メンバーまたはの友人のみであることを意味します。メンバーや友人の外でこのコードを書くと、コンパイルに失敗しますPrivPrivPriv

同様に:

Priv aPriv;
aPriv.SomeFunc();

これがのメンバーまたは友人内にある場合にのみ機能しPrivます。

プライベート継承とは、派生クラスのメンバーまたはフレンドのみが基本クラスコンポーネントにアクセスできることを意味します。したがって、メンバー関数は派生クラスの基本クラス部分を呼び出すことができますが、外部の誰も呼び出すことができません。

別のクラスからクラスを公に派生させる場合、派生クラスは「基本クラス」であると言います。それはまさにそれらのタイプの1つです。基本クラスから個人的に派生する場合、外部からの派生を隠しています。これは、基本クラスの実装を使用して派生クラスを実装しているが、他の誰もそれを知る必要がないことを意味します。派生クラスは、基本クラスの「観点から実装」されます。

于 2011-11-26T20:42:57.537 に答える
1

プライベート継承は、クラスの構成を実装する方法です。このC++FAQには、このトピックに関する全章があります。http://www.parashift.com/c++-faq-lite/private-inheritance.htmlを参照してください。

于 2011-11-26T20:32:07.237 に答える
0

問題は解決しませんが、より多くのコード設計オプションが可能になります。この場合、からのすべてのメソッドBarはでプライベートになりFooます。

于 2011-11-26T20:28:10.060 に答える