The non-virtual-interface pattern is the use of an abstract-base-class with public non-virtual functions that delegate to (pure) virtual functions that can be overridden by derived classes.