2012-09-02 21 views
6

Mögliche Duplizieren:
Private virtual method in C++C++: Private virtuelle Funktionen vs. rein virtuelle Funktionen

Wenn ich mich richtig von diesem Posten verstanden (Private virtual method in C++), eine virtuelle Funktion in einer Basisklasse machen macht die abgeleiteten Klassen in der Lage, sie zu überschreiben. Aber es scheint, dass die Dinge dort aufhören.

Wenn die virtuelle Funktion der Basisklasse jedoch rein ist, erzwingt dies die abgeleiteten Klassen zur Implementierung der Funktion. Daher ist eine reine (öffentliche) virtuelle Funktion lediglich eine Schnittstelle. Ich kann hier einen Vorteil sehen.

Auf der anderen Seite gibt die abgeleitete Klasse der virtuellen Klasse nur die Möglichkeit, die Funktion zu überschreiben, aber ich sehe keinen Vorteil davon. Es ist, als ob diese private virtuelle Funktion nicht einmal da ist. Die abgeleitete Klasse weiß offensichtlich nichts über die Existenz dieser virtuellen Funktion in der Basisklasse, weil sie privat ist. Gibt es also einen Vorteil, eine virtuelle Basisklasse-Funktion als Vererbung oder Polymorphie zu deklarieren?

Gibt es auch eine Situation, in der eine Basisklasse eine Funktion "rein virtuell" und "privat" deklarieren würde?

Vielen Dank.

Antwort

12

Ein Vorteil ist die template method pattern bei der Umsetzung:

class Base { 

public : 
    void doSomething() { 
    doSomething1(); 
    doSomething2(); 
    doSomething3(); 
    } 
private: 
    virtual void doSomething1()=0; 
    virtual void doSomething2()=0; 
    virtual void doSomething3()=0; 
}; 


class Derived : public Base { 
    private: 
    virtual void doSomething1() { ... } 
    virtual void doSomething2() { .... } 
    virtual void doSomething3() { .... } 
} 

Das ist die abgeleiteten Klassen kann jedes Stück einer gewissen Logik implementieren, während die Basisklasse festgelegt, wie diese Stücke zusammen zu setzen. Und da die Teile selbst keinen Sinn ergeben, werden sie als private deklariert und so vor dem Client-Code verborgen.

0

Wenn die Methode virtuell ist, kann sie von abgeleiteten Klassen außer Kraft gesetzt werden, selbst wenn sie privat ist. Jedenfalls sollte es mit geschützt erklärt werden.

+2

Warum sollten Sie es als geschützt deklarieren, wenn Sie wissen, dass Sie nie von abgeleiteten Klassen auf die Basismethode zugreifen müssen? Sie können etwas überschreiben, ohne es aufrufen zu müssen. –

+0

http://www.parashift.com/c++faq-lite/private-virtuals.html – Samson

+0

Kein Grund es * sollte * als "geschützt" erklärt werden. Wenn Sie "geschützt" brauchen, verwenden Sie es. Wenn nicht, dann benutze 'private'. – juanchopanza

3

Es ist für Situationen, in denen Base möchte, dass ihre Kinder Funktionalität implementieren, die die Basis selbst verwenden muss. Stellen Sie sich ein dummes Beispiel vor - Autos.

class Car { 
public: 
    int getTorque(); 
    int getPower(); 

private: 
    virtual const Engine& gimmeEngine() = 0; 
}; 

class Ferrari : public Car { 
private: 
    FerrariEngine myCoolEngine; 
    const Engine& gimmeEngine() { return myCoolEngine; } 
}; 

Jetzt Auto braucht nichts über Ferraris Motor zu wissen, nur, dass es einige Engine-Schnittstelle implementiert, die garantiert, dass Car die Informationen über seine Leistung und Drehmoment erhalten.

In diesem dummen Beispiel könnte alles vereinfacht werden, getTorque und getPower rein virtuell machen, aber ich hoffe, es illustriert die Idee. Base muss einige spezifische Logik verwenden es kennt jedes Kind muss haben, so fragt es es durch eine private rein virtuelle Mitglied.

Verwandte Themen