1

C ++では、Baseのプライベート基本クラスであるDerivedBase仮想関数を持たないクラスがある場合、代わりに継承を持つことをクラス内のカプセル化に置き換える方がクリーンEncapsulateですか?この場合の継承の唯一の利点は、を介してではなく、派生クラスで直接基本クラスにアクセスできることだと思いますmemberVariable。どちらか一方の方法がより良いと考えられていますか、それとも個人的なスタイルの質問ですか?

class Base {
  public:
    void privateWork();
    // No virtual member functions here.
};

class Derived : Base {
  public:
    void doSomething() {
      privateWork();
    }
};

class Encapsulate {
    Base memberVariable;

  public:
    void doSomething() {
      memberVariable.privateWork()
    }
};
4

2 に答える 2

2

関数がない場合はvirtual、OOで継承を使用しないでください。これは、使用してはならないという意味ではないことに注意してください。OO以外の目的で継承を(乱用)使用する必要がある(限定された)場合がいくつかあります。

于 2012-07-02T20:55:34.260 に答える
2

継承モデルは「リスコフの置換」であることを忘れないでください。Fooは、Barを期待するすべての関数にFoo変数を渡すことができる場合にのみBarです。プライベート継承はこれをモデル化しません。構成をモデル化します(FooはBarの観点から実装されます)。

さて、2番目のバージョンはよりシンプルで意図をよりよく表現しているため、ほとんどの場合、常に2番目のバージョンを使用する必要があります。2番目のバージョンについて知らない人にとっては混乱が少なくなります。

ただし、場合によっては、プライベート継承が便利です。

class FooCollection : std::vector<Foo>
{
public:
    FooCollection(size_t n) : std::vector<Foo>(n) {};

    using std::vector<Foo>::begin;
    using std::vector<Foo>::end;
    using std::vector<Foo>::operator[];
};

vectorこれにより、begin、end、およびの2つのバージョン(const + non const)を手動で転送しなくても、の機能の一部を再利用できますoperator[]

この場合、ポリモーフィズムはまったくありません。これは継承ではなく、構成は偽装です。FooCollectionをベクトルとして使用する方法はありません。特に、仮想デストラクタは必要ありません。

于 2012-07-03T06:30:02.357 に答える