非虚拟接口习语是否可以继承两个以上的层次?

时间:2020-03-06 14:34:00  来源:igfitidea点击:

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

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

解决方案

派生类可以自行决定:

我们可以通过实现虚函数完全覆盖该方法。
我们可以通过在派生类方法中的某个时刻调用"中间"类函数来扩充该方法。

如果这不是我们想要的,则需要在"中间"类中进行显式设置。我不会如果发现自己想要这样做,则可能意味着我们没有给基类足够的定制点。

它起作用,因为派生类可以覆盖基类的私有虚函数,即使基类函数覆盖其基类函数也是如此。

这是完全合法的:

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