0

假设我有一个提供公共模板方法的超类。子类必须实现一些子操作。我如何声明这个子操作以确保它们只能被调用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

在这两种情况下都使用“私人”

可以从超类调用私有方法,因为 Supercalss 不知道 SubClass 中覆盖方法的可访问性

于 2016-03-07T10:56:41.037 回答
1

在 C++ 中,您可以通过在所有类中创建op1和来实现您的目标。op2 private这种技术在 C++ 中是惯用的。

基类private通过实例化对象时设置的 v-table访问子类中的函数。

当然,没有什么可以阻止您的子类中的另一个函数调用private该子类中标记的函数。如果您想这样做那么子类将不是该函数的正确位置。

Java 也可以这样说,当然那virtual是自动的。

于 2016-03-07T11:08:20.407 回答
0
class SuperClass{
    public:
      void templateMethod(){
         op1();
         op2();
      } 

    private:
      virtual void op1() = 0;
      virtual void op2() = 0;
}

不需要写private,但是在界面提供一些信息也不错。

class SubClass : public SuperClass{
      virtual void op1() { ... };
      virtual void op2() { ... };
} 

等于

class SubClass : public SuperClass{
    private:
      virtual void op1() { ... };
      virtual void op2() { ... };
} 
于 2016-03-07T11:50:40.677 回答