默认的纯虚拟实现C ++

时间:2012-11-25 14:04:47

标签: c++

  

可能重复:
  pure virtual function with implementation

我有一个基类,它有一个名为time()的函数 我的想法是拥有一个纯虚函数,所有继承自它的类都必须实现。

但是我也想添加默认行为;调用time()函数的人需要打印“你好”。
那可能吗?

2 个答案:

答案 0 :(得分:3)

实现此类目标的最简单方法是使用以下内容:

  class base {
       virtual void time_impl()=0;
  public:
       void time() {
             //Default behaviour
             std::cout << "Hello\n";
             //Call overridden behaviour
             time_impl();
       }
  };

  class child : public base {
       void time_impl() override {
            //Functionality
       }
  };

这样,当调用任何子节点的time函数时,它会调用基类时间函数,该函数执行默认行为,然后对被覆盖的行为进行virtual调用。

编辑:

正如Als在评论中所说,这被称为模板方法模式,您可以在这里阅读:

http://en.wikipedia.org/wiki/Template_method_pattern

虽然C ++是一个相当混乱的名称(因为模板是其他东西,而“方法”在C ++中并不意味着什么(而是member function)。

编辑:

有人评论了使用覆盖,这是一个C ++ 11的功能,如果你有它使用它,从长远来看它会省去很多麻烦:

http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final

此外,_impl函数应该是私有的,除非您希望用户绕过默认行为,但我认为在大多数用例中这是一个糟糕的设计。

工作测试用例

http://ideone.com/eZBpyX

答案 1 :(得分:0)

您可以通过virtual函数pure virtual来提供基类中的默认行为。 但是,您不能强制实现调用此默认行为,而不会对子实现实施某些限制(有关详细信息,请参阅@ 111111答案)。您应该检查您的要求,看看这是否是可接受的解决方案。