Как реализовать интерфейсный класс, используя не-виртуальную идиому интерфейса в C ++?

В C ++ интерфейс может быть реализован классом со всеми его методами чисто виртуальными.

Такой класс может быть частью библиотеки, чтобы описать, какие методы должен реализовать объект, чтобы иметь возможность работать с другими классами в библиотеке:

class Lib::IFoo
{
    public:
        virtual void method() = 0;
};

:

class Lib::Bar
{
    public:
        void stuff( Lib::IFoo & );
};

Теперь я хочу использовать класс Lib :: Bar, поэтому мне нужно реализовать интерфейс IFoo.

Для моих целей мне нужен целый ряд связанных классов, поэтому я бы хотел работать с базовым классом, который гарантирует общее поведение с использованием идиомы NVI:

class FooBase : public IFoo // implement interface IFoo
{
    public:
        void method(); // calls methodImpl;

    private:
        virtual void methodImpl();
};

Идиома невиртуального интерфейса (NVI) должна лишать производные классы возможности переопределения общего поведения, реализованного вFooBase::method(), но с тех порIFoo сделав его виртуальным, кажется, что все производные классы имеют возможность переопределитьFooBase::method().

Если я хочу использовать идиому NVI, какие варианты я уже предложил, кроме идиома pImpl (спасибо space-c0wb0y).

Ответы на вопрос(4)

Ваш ответ на вопрос