0

public テンプレート メソッドを提供するスーパー クラスがあるとします。サブクラスは、いくつかのサブ操作を実装する必要があります。このサブオペレーションを からのみ呼び出すことができるように宣言するにはどうすればよいSuperClassですか? がありますがprotected、私が知る限り、それは逆に機能します。サブクラスは、保護されたスーパークラスのメンバーにアクセスできます。スーパークラス (およびスーパークラスのみ!) がサブクラス メンバーを呼び出せるようにしたいと考えています。

class SuperClass{
    public:
      void templateMethod(){
         this->op1();
         this->op2();
      } 

      // how to declare these? public? protected?
      virtual void op1() = 0;
      virtual void op2() = 0;
}

class SubClass : public SuperClass{
      // how to declare these? public? protected?
      virtual void op1() { ... };
      virtual void op2() { ... };
} 

私は現在 C++ と Matlab で作業していますが、他の言語を考慮した一般的な意見にも非常に興味があります。

4

3 に答える 3

1

C++ では、すべてのクラスでop1andを作成することで目的を達成できます。op2 privateこの手法は、C++ では慣用的です。

基本クラスprivate、オブジェクトがインスタンス化されるときに設定される v テーブルを介して、子クラスの関数にアクセスします。

もちろん、子クラスの別の関数がprivate、その子クラスでマークされた関数を呼び出すのを止めるものは何もありません。それをしたい場合、子クラスは関数の正しい場所ではありません。

もちろん自動であることを除いて、Javaについても同じことが言えvirtualます。

于 2016-03-07T11:08:20.407 に答える
1

どちらの場合も「プライベート」を使用してください

Supercalss は SubClass でオーバーライドされたメソッドのアクセス可能性を認識していないため、スーパークラスからプライベート メソッドを呼び出すことができます。

于 2016-03-07T10:56:41.037 に答える