4

以下では、C1で宣言されたfn(...)関数がC2に移行することを知っていますが、そのような設計using C1::fn;のベストプラクティスを知りたいですか?using

fn()関数がC1状態を使用していない場合、ヘルパークラスがより良い方法であると宣言する必要がありますか?fn関数がC1状態を使用している場合、usingカプセル化を解除していますか?

C++11の使用例についても触れていただければ幸いです。using Base::Base;派生メンバーの初期化子からコンストラクターを呼び出す代わりに、コンストラクターを使用するのが好きですか?

class C1
{
  //...
  public:
    int fn(int j) { ... }
    double fn(double w) { ... }
    void fn(const char * s) { ... }
};

class C2 : public C1
{
  //...
public:
  //...
  using C1::fn;
  double fn(double) { ... };
};
4

2 に答える 2

6

fn 関数が C1 状態を使用している場合、カプセル化の解除を使用していますか?

このusingステートメントはカプセル化を壊しません。privateC1 からの状態を公開したり、C1 がその不変条件を維持するのを妨げたりすることはありません。fnこれは、C1 が持つ他のメンバー (この場合) を公開する純粋に便利な方法であるint fn(int)ため、呼び出しを解決するときにそれらを考慮することができます。機能的に同等と考えてください...

class C2 : public C1
{
    ...
    inline int fn(int j) { return C1::fn(j); }
};

...しかし、C1 のオーバーロードのリストと同期するために関数を手動で追加および削除する必要がないため、より良い方法です。

fn() 関数が C1 状態を使用していない場合、ヘルパー クラスを宣言する方がよい方法ですか?

C1 状態を使用していない場合は、静的または非メンバーである必要があります。私の意見では、ヘルパークラスは醜い考えです。名前空間は、C++ で機能をグループ化するための通常の方法です。クラスを使用し、すべての議論を理解するというラコス教授の推奨事項については十分承知していますが、それでも同意しません。ヘルパー クラスの言及があなたにとって単なるものではない場合は、喜んで実行してください。

于 2012-11-13T11:08:36.837 に答える
1

using必要なときはいつでも使うべきだと思います。つまり、基本クラスのメンバー関数が派生クラスで宣言されたメンバー関数によって隠されるたびに。

私の理論的根拠は、C2(たとえば を介してC2 *pc)アクセスするコードC2は が から派生したものであることを認識しているため、を介して関数C1を呼び出すことができると期待しているというものです。C1pc

于 2012-11-13T11:00:40.240 に答える