非虚拟接口习语是否可以继承两个以上的层次?
时间: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(); };