非虚拟接口习惯用于两个以上的继承级别?

时间:2008-09-22 21:17:25

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

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

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

2 个答案:

答案 0 :(得分:5)

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

这是完全合法的:


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();
};

答案 1 :(得分:1)

派生类可以自行决定:

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

如果那不是你想要的,你需要在'中间'课程中明确地设置它。我不会。如果您发现自己希望这样,那可能意味着您没有给基类足够的自定义点。