2008-09-22 6 views
5

Das nicht virtuelle Schnittstellen-Idiom beschreibt, wie die virtuellen Methoden nicht-öffentliche Anpassungspunkte sind und öffentliche Methoden nicht virtuell sind, damit die Basisklasse jederzeit kontrollieren kann, wie die Anpassungspunkte aufgerufen werden.nonvirtuelle Schnittstelle Idiom für mehr als zwei Ebenen der Vererbung?

Dies ist ein elegantes Idiom und Ich mag es zu benutzen, aber wie funktioniert es, wenn die abgeleitete Klasse eine Basisklasse an sich

Antwort

5

Dies funktioniert, weil die abgeleitete Klasse eine private virtuelle Funktion einer Basisklasse überschreiben kann, selbst wenn die Basisklassenfunktion ihre Basisklassenfunktion außer Kraft setzt. Diese

ist völlig 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(); 
}; 
1

Die abgeleitete Klasse für sich entscheiden können:

Sie können nur überschreiben Sie die Methode vollständig, indem Sie die virtuelle Funktion implementieren. Sie können die Methode erweitern, indem Sie die Funktion 'middle' classes zu einem bestimmten Zeitpunkt in der abgeleiteten Klassenmethode aufrufen.

Wenn Sie das nicht möchten, müssen Sie es explizit in der Klasse 'middle' einrichten. Ich würde es nicht tun. Wenn Sie dies wünschen, bedeutet dies wahrscheinlich, dass Sie der Basisklasse nicht genügend Anpassungspunkte gegeben haben.