【问题标题】:Default pure virtual implementation C++ [duplicate]默认纯虚拟实现 C++ [重复]
【发布时间】:2012-11-13 03:44:57
【问题描述】:

可能重复:
pure virtual function with implementation

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

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

【问题讨论】:

标签: c++


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

      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 函数时,它会调用基类 time 函数,该函数执行默认行为,然后对覆盖的行为进行 virtual 调用。

    编辑:

    正如 Als 在 cmets 中所说,这称为模板方法模式,您可以在此处阅读:

    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

    【讨论】:

    • 你不妨补充一下,这就是著名的模板方法设计模式。
    • +1 for C++11 - 我忘了override 在那里。编辑:别管第二个问题,谢谢你让我学到了新东西!
    • 值得注意的是,这会强制孩子同时实现timetime_impl
    • @icepack 为什么孩子要实施时间?
    • @111111 因为这是需求和定义的接口
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 2012-05-04
    • 2019-02-21
    • 2011-04-17
    • 2015-11-30
    • 2014-11-06
    • 1970-01-01
    相关资源
    最近更新 更多