0

可能重复:
带有实现的纯虚函数

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

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

4

2 回答 2

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)。

编辑:

有人评论了override的使用,这是C++11的一个特性,如果你拥有它,从长远来看会省去很多头疼的问题:

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

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

工作测试用例

http://ideone.com/eZBpyX

于 2012-11-25T14:08:35.707 回答
0

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

于 2012-11-25T14:27:50.530 回答