【发布时间】:2024-04-10 19:30:02
【问题描述】:
非虚拟接口习惯用法描述了虚拟方法如何成为非公共定制点,公共方法是非虚拟的,以允许基类始终控制如何调用定制点。
这是一个优雅的习惯用法,我喜欢使用它,但是如果派生类本身就是一个基类,它是如何工作的
【问题讨论】:
标签: c++ inheritance class-design non-virtual-interface
非虚拟接口习惯用法描述了虚拟方法如何成为非公共定制点,公共方法是非虚拟的,以允许基类始终控制如何调用定制点。
这是一个优雅的习惯用法,我喜欢使用它,但是如果派生类本身就是一个基类,它是如何工作的
【问题讨论】:
标签: c++ inheritance class-design non-virtual-interface
派生类可以自己决定:
您可以通过实现虚函数来完全覆盖该方法。 您可以通过在派生类方法中的某个位置调用“中间”类函数来扩充该方法。
如果这不是您想要的,您需要在“中间”类中明确设置它。不过我不会。如果您发现自己想要这样做,这可能意味着您没有为基类提供足够的自定义点。
【讨论】:
它可以工作,因为派生类可以覆盖基类的私有虚函数,即使基类函数覆盖了它的基类函数。
这是完全合法的:
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();
};
【讨论】: