views:

332

answers:

2

The non-virtual interface idiom describes how the virtual methods are nonpublic customisation points, and public methods are nonvirtual to allow the base class to control at all times how the customisation points are called.

This is an elegant idiom and I like to use it, but how does it work if the derived class is a base class in itself

A: 

The derived class can decide for itself:

You can just override the method completely by implementing the virtual function. You can augment the method by calling the 'middle' classes function at some point in your derived class method.

If that's not what you want, you need to set it up explicitly in the 'middle' class. I wouldn't though. If you find yourself desiring this, it probably means you didn't give the base class enough customization points.

Mike Elkins
+3  A: 

It works, because the derived class can override a private virtual function of a base class, even if the base class function overrides its base class function.

This is perfectly legal:


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