基于条件覆盖C ++函数

时间:2016-07-06 16:17:19

标签: c++ inheritance override

所以我长期使用C和Java,但我并不熟悉C ++。情况是我们有:

base class template 1 -> base class template 2 -> several relevant subclasses

目前所有最终的子类都继承了类1中的成员函数,但我们只需要在其中一个子类中更改此函数的行为,并且只有在设置了代码中的其他位置的变量时才能更改,否则运行函数如类1中所定义。有没有办法在if-else的另一端没有插入整个函数定义的情况下执行此操作?我已经查看了SFINAE / enable-if,但这些用于基于类型的决策,而不是像这样的简单条件。

如果我遗漏任何容易或愚蠢的事,请告诉我。

某些伪代码可能有所帮助:

template <class Face> class Publisher {
  virtual void publish(...) {
    // do stuff
  }
}

template <class NewsType> class NewsPublisher : public Publisher<OnlineFace> {
  // constructors, destructors...
}

class MagazinePublisher : public NewsPublisher<Sports> {
  void publish(...) {
    if(that.theOther() == value) {
      // do different stuff
    } else {
      // do whatever would have been done without this override here
    }
  }
}

1 个答案:

答案 0 :(得分:4)

根据您的示例,您只需显式调用基类实现:

class MagazinePublisher : public NewsPublisher<Sports> {
  void publish(...) {
    if(that.theOther() == value) {
      // do different stuff
    } else {
      // call the base class implementation, as this function would not
      // have been overridden:
      NewsPublisher<Sports>::publish(...);
   // ^^^^^^^^^^^^^^^^^^^^^^^
    }
  }
}

好吧,我想你的实际基类函数publish()被声明为virtual成员。

此外,由于您的示例只是伪代码而我无法对其进行测试,因此您可能需要添加publish()类中应使用的NewsPublisher<T>实现:

template <class NewsType> class NewsPublisher : public Publisher<OnlineFace> {
public:
  // constructors, destructors...
  using Publisher<OnlineFace>::publish(); // <<<<<<<<<<<<<
}