Frage

Ich habe zwar seltene Fälle gesehen, in denen Privat Eine Vererbung war erforderlich, ich habe noch nie einen Fall erlebt, in dem geschützt Vererbung ist nötig.Hat jemand ein Beispiel?

War es hilfreich?

Lösung

Die Leute hier scheinen die Vererbung geschützter Klassen mit geschützten Methoden zu verwechseln.

FWIW, ich habe noch nie jemanden gesehen, der die Vererbung geschützter Klassen verwendet, und wenn ich mich richtig erinnere, denke ich, dass Stroustrup die „geschützte“ Ebene sogar für einen Fehler in C++ gehalten hat.Es gibt kaum etwas, was Sie nicht tun können, wenn Sie diese Schutzstufe aufheben und sich nur noch auf öffentliche und private Daten verlassen.

Andere Tipps

Es gibt einen sehr seltenen Anwendungsfall der geschützten Vererbung.Es ist der Ort, den Sie nutzen möchten Kovarianz:

struct base { 
    virtual ~base() {} 
    virtual base & getBase() = 0;
}; 

struct d1 : private /* protected */ base { 
    virtual base & getBase() { 
        return this; 
    } 
}; 

struct d2 : private /* protected */ d1 {
    virtual d1 & getBase () { 
        return this; 
    } 
}; 

Das vorherige Snippet hat versucht, seine Basisklasse zu verbergen und eine kontrollierte Sichtbarkeit der Basen und ihrer Funktionen zu ermöglichen, aus welchem ​​Grund auch immer, indem es eine „getBase“-Funktion bereitgestellt hat.

Es wird jedoch in der Struktur fehlschlagen d2, seit d2 weiß das nicht d1 abgeleitet ist von base.Daher, covariance wird nicht funktionieren.Ein Ausweg besteht darin, sie geschützt abzuleiten, sodass die Vererbung in d2 sichtbar ist.

Ein ähnliches Beispiel hierfür ist die Ableitung von std::ostream, aber Sie möchten nicht, dass zufällige Personen in Ihren Stream schreiben.Sie können eine virtuelle bereitstellen getStream Funktion, die zurückkommt std::ostream&.Diese Funktion könnte den Stream für den nächsten Vorgang vorbereiten.Zum Beispiel das Einsetzen bestimmter Manipulatoren.

std::ostream& d2::getStream() {
    this->width(10);
    return *this;
}

logger.getStream() << "we are padded";

C++ FAQ Lite erwähnt einen Fall, in dem die Nutzung privater Erbschaften eine legitime Lösung ist (siehe [24.3.] Was sollte ich bevorzugen:Komposition oder private Vererbung?).Dies ist der Fall, wenn Sie die abgeleitete Klasse aus einer privaten Basisklasse heraus über eine virtuelle Funktion aufrufen möchten (in diesem Fall). derivedFunction()):

class SomeImplementationClass
{
protected:
    void service() {
        derivedFunction();
    }

    virtual void derivedFunction() = 0;      

    // virtual destructor etc
};

class Derived : private SomeImplementationClass
{
    void someFunction() {
        service();
    }

    virtual void derivedFunction() {
        // ...
    }

    // ...
};

Wenn Sie nun von der Klasse Derived ableiten und diese verwenden möchten Base::service() aus der abgeleiteten Klasse (sagen wir, Sie möchten verschieben). Derived::someFunction() zur abgeleiteten Klasse), der einfachste Weg, dies zu erreichen, besteht darin, die private Vererbung von zu ändern Base zum geschützten Erbe.

Tut mir leid, mir fällt kein konkreteres Beispiel ein.Persönlich mache ich gerne alle Erbschaften öffentlich, um keine Zeit mit Diskussionen darüber zu verschwenden, ob ich die Erbschaft geschützt oder privat machen soll.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top