【问题标题】:nonvirtual interface idiom for more than two levels of inheritance?用于两个以上继承级别的非虚拟接口习惯用法?
【发布时间】:2024-04-10 19:30:02
【问题描述】:

非虚拟接口习惯用法描述了虚拟方法如何成为非公共定制点,公共方法是非虚拟的,以允许基类始终控制如何调用定制点。

这是一个优雅的习惯用法,我喜欢使用它,但是如果派生类本身就是一个基类,它是如何工作的

【问题讨论】:

    标签: c++ inheritance class-design non-virtual-interface


    【解决方案1】:

    派生类可以自己决定:

    您可以通过实现虚函数来完全覆盖该方法。 您可以通过在派生类方法中的某个位置调用“中间”类函数来扩充该方法。

    如果这不是您想要的,您需要在“中间”类中明确设置它。不过我不会。如果您发现自己想要这样做,这可能意味着您没有为基类提供足够的自定义点。

    【讨论】:

      【解决方案2】:

      它可以工作,因为派生类可以覆盖基类的私有虚函数,即使基类函数覆盖了它的基类函数。

      这是完全合法的:

      
      class Parent
      {
      public:
        int foo() {return bar();} // the non-virtual public interface
      private
        virtual int bar();
      };
      
      class Child : public Parent
      {
      private:
        virtual int bar();  // overrides Parent::bar()
      };
      
      class Grandchild : public Child
      {
      private:
        virtual int bar(); // overrides Child::bar();
      };
      

      【讨论】:

        最近更新 更多