Wie implementiere ich eine Interface-Klasse mit der nicht-virtuellen Interface-IDiom in C ++?

n C ++ kann eine Schnittstelle von einer Klasse mit all ihren Methoden rein virtuell implementiert werde

Eine solche Klasse könnte Teil einer Bibliothek sein, um zu beschreiben, welche Methoden ein Objekt implementieren sollte, um mit anderen Klassen in der Bibliothek arbeiten zu können:

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

:

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

Jetzt möchte ich die Klasse Lib :: Bar verwenden, also muss ich die IFoo-Schnittstelle implementieren.

Zu meinen Zwecken benötige ich eine ganze Reihe verwandter Klassen, daher möchte ich mit einer Basisklasse arbeiten, die unter Verwendung der NVI-Sprache ein allgemeines Verhalten garantiert:

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

    private:
        virtual void methodImpl();
};

Die nicht-virtuelle Schnittstelle (NVI) sollte abgeleiteten Klassen die Möglichkeit verweigern, das in @ implementierte allgemeine Verhalten zu überschreibeFooBase::method(), aber seitIFoo hat es virtuell gemacht Es scheint, dass alle abgeleiteten Klassen die Möglichkeit haben, das @ zu überschreibeFooBase::method().

Wenn ich das NVI-Idiom verwenden möchte, welche anderen Optionen habe ich als das bereits vorgeschlagene pImpl-Idiom (danke space-c0wb0y).

Antworten auf die Frage(8)

Ihre Antwort auf die Frage