2009-03-19 15 views
8

私は図書館に次のコードを見つけました:この間接関数呼び出しの利点は何ですか?

class Bar { 
public: 
    bool foo(int i) { 
    return foo_(i); 
    } 
private: 
    virtual bool foo_(int i) = 0; 
}; 

は、今私は思ったんだけど:なぜ、あなたはこの間接を使うのでしょうか?上記の単純な選択肢よりも良いだろう、なぜ任意の理由があるのだろう。

class Bar { 
public: 
    virtual bool foo(int i) = 0; 
}; 

答えて

10

これはNon-Virtual Interface Idiom(NVI)です。ハーブ・サッターのそのページには、それに関する細かい細部があります。しかし、C++のFAQライトにはherehereと書かれています。

NVIの主な利点は、インターフェイスを実装から分離することです。基本クラスはジェネリックアルゴリズムを実装して世界に提示することができますが、そのサブクラスは仮想関数を使用してアルゴリズムの詳細を実装できます。外部ユーザーは、アルゴリズムの詳細の変更から保護されています。特に、後処理コードを追加することを後で決定した場合は特にそうです。

明白な欠点は、余分なコードを書く必要があることです。また、private仮想関数は多くの人を混乱させる。多くのコーダーは間違いなくあなたがそれらを上書きできないと思っています。ハーブ・サッターはprivateのバーチャルを気に入っているようですが、実際にはC++ FAQライトの推奨に従って、protectedにする方が効果的です。

3

これは、多くの場合、ウルフギャング・プリーにより造語、(ホットスポットa.k.a)テンプレート・フックのペアと呼ばれています。

あなたはそれを呼び出すよう間接を行うため、このPDFPowerPointHTML

一つの理由は、物事はしばしば/従来の方法、およびいくつかのcleaing ポスト A セットアップなければならないということです参照してください。メソッド呼び出し。サブクラスでは、唯一のサブクラスがfoo_の定義を変更することができれば

0

...とを清掃セットアップを実行せずに、必要な行動を供給する必要がある?しかし、消費者が(効率のために)、静的な機能を必要と?または委任パターンのために?

2

テンプレートパターンです。 fooメソッドには、すべてのサブクラスで実行する必要があるコードが含まれています。

class Bar { 
public: 
    bool foo(int i) { 
    // Setup/initialization/error checking/input validation etc 
    // that must be done for all subclasses 
    return foo_(i); 
    } 
private: 
    virtual bool foo_(int i) = 0; 
}; 

それは個別に各サブクラスに共通のコードを呼び出すことを覚えしようとすることです代わる、より立派だ:それはあなたがこのようにそれを見て、より理にかなっています。必然的に、誰かがサブクラスを作成しますが、共通コードを呼び出すことを忘れてしまい、結果的に多くの問題が発生します。

関連する問題