8

重複の可能性:
C++のプライベート仮想メソッド

この投稿( C ++のプライベート仮想メソッド)から正しく理解していれば、基本クラスで仮想関数を作成すると、派生クラスがそれをオーバーライドできるようになります。しかし、物事はそこで止まるようです。

ただし、基本クラスの仮想関数が純粋である場合、派生クラスに関数を実装するように強制します。したがって、純粋(パブリック)仮想関数は単なるインターフェースです。ここでメリットがわかります。

一方、基本クラスの仮想関数をプライベートにすると、派生クラスに関数をオーバーライドする機能しか与えられませんが、これによるメリットはわかりません。まるでそのプライベート仮想関数がそこにさえないかのようです。派生クラスは、そのプライベートであるため、基本クラスにその仮想関数が存在することを明らかに認識していません。したがって、継承またはポリモーフィズムの観点から、基本クラスのプライベート関数を仮想として宣言する利点はありますか?

また、基本クラスが関数「純粋仮想」と「プライベート」を宣言する状況はありますか?

ありがとうございました。

4

3 に答える 3

14

1つの利点は、テンプレートメソッドパターンを実装することです。

class Base {

 public :
  void doSomething() {
    doSomething1();
    doSomething2();
    doSomething3();
  }
 private:
   virtual void doSomething1()=0;
   virtual void doSomething2()=0;
   virtual void doSomething3()=0;
};


class Derived : public Base {
  private:
   virtual void doSomething1() { ... }
   virtual void doSomething2() { .... }
   virtual void doSomething3() { .... }
}

これにより、派生クラスは特定のロジックの各部分を実装でき、基本クラスはこれらの部分を組み合わせる方法を決定します。また、これらの部分はそれ自体では意味をなさないため、宣言さprivateれ、クライアントコードから隠されています。

于 2012-09-02T09:20:26.607 に答える
3

これは、ベース自体が使用する必要のある機能をベースが子に実装することを望んでいる状況向けです。ばかげた例を想像してみてください-車。

class Car {
public:
    int getTorque();
    int getPower();

private:
    virtual const Engine& gimmeEngine() = 0;
};

class Ferrari : public Car {
private:
    FerrariEngine myCoolEngine;
    const Engine& gimmeEngine() { return myCoolEngine; }
};

現在、Carはフェラーリのエンジンについて何も知る必要はありません。ただ、そのパワーとトルクに関する情報を取得できることEngineを保証するいくつかのインターフェースを実装しているだけです。Car

getTorqueこのばかげた例では、純粋な仮想を作成することですべてを単純化できますがgetPower、それがアイデアを示していることを願っています。すべての子が持つ必要があることがわかってBaseいる特定のロジックを使用する必要があるため、プライベートの純粋な仮想メンバーを介してクエリを実行します。

于 2012-09-02T09:27:07.210 に答える
0

メソッドが仮想の場合、プライベートであっても、派生クラスによってオーバーライドできます。とにかく、それは保護された状態で宣言されるべきです。

于 2012-09-02T09:21:37.077 に答える