2012-03-31 8 views
6

Es ist klar, über das öffentliche und private Erbe, aber was ist geschützt? Jedes Beispiel, wenn wir es wirklich brauchen und es uns Vorteile bringt?In welchen Fällen benötigen wir geschützte Vererbung?

+0

'giveы': Hallo aus Russland :) – iehrlich

+2

Verwandte: [geschützte Vererbung] (http: // Stackoverflow .com/questions/2090661/protected-vererbung) – ipc

+2

Nicht jeder Teil von C++ ist nützlich. Es ist natürlich, * ein Merkmal wie eine geschützte Vererbung * zu definieren, da es genau in das allgemeine Schema passt, aber das macht es nicht weit (oder überhaupt) nützlich. Sogar einige Dinge, die * explizit * entworfen wurden, stellten sich als nicht nützlich heraus, wie 'valarray',' export', 'vector ' oder Ausnahmenspezifikationen. –

Antwort

3

Das Base-from-Member-Idiom muss zeitweise geschützt sein.

Das Problem, das Adressen Idiom ist folgende: Sie ist manchmal initialisieren müssen die Basisklasse mit einem Mitglied der abgeleiteten Klasse, wie in

struct foo 
{ 
    virtual ~foo() {} 

protected: 
    foo(std::ostream& os) 
    { 
     os << "Hello !\n"; 
    } 
}; 

struct bar : foo 
{ 
    bar(const char* filename) 
     : foo(file), file(filename) // Bad, file is used uninitialized 
    {} 

private: 
    std::fstream file; 
}; 

Aber filenachfoo aufgebaut und damit die ostream an foo::foo übergeben ist ungültig.

Sie lösen diese mit einer Hilfsklasse und private Vererbung:

struct bar_base 
{ 
    std::fstream file; 

protected: 
    bar_base(const char* filename) 
     : file(filename) 
    {} 

    ~bar_base() {} 
}; 

struct bar : private bar_base, public foo 
{ 
    bar(const char* filename) 
     : bar_base(filename), foo(file) 
    {} 
}; 

Jetzt ist bar_base vor foo konstruiert, und die ostream-foo::foo bestanden gilt.

Wenn Sie file wollen ein geschützt werden Mitglied bar, müssen Sie geschützt Vererbung:

struct bar : protected bar_base, public foo { ... } 
2

protected bedeutet, dass die Elementvariablen von Unterklassen aus zugänglich sind, aber nicht von außen.

Ein sehr einfaches Beispiel kann eine Klasse sein, die eine Variable (zB x) für interne Berechnungen verwendet. Wenn eine Unterklasse die gleiche Berechnung ausführen muss, muss wahrscheinlich auf x zugegriffen werden. Wenn Sie es als privat festlegen, vermeiden Sie, dass die Unterklasse auf es zugreift, und machen es für alle zugänglich. Geschützt ist wie ein Kompromiss.

+2

Die Frage bezieht sich auf geschützte Vererbung, 'class a: protected b ', nicht über geschützte Mitglieder. –

0

Protected ist besonders nützlich, abstrakte Oberklassen, mit dem Wissen der Kinder im Verstand geschrieben. Geschützte Mitglieder und Methoden sind für die Kinder verfügbar und können die Code-Replikation speichern, ohne sie der Welt außerhalb der Familie von Klassen zu präsentieren, die gerade implementiert werden.

+2

Die Frage bezieht sich auf geschützte Vererbung, 'Klasse a: protected b', nicht über geschützte Mitglieder. –

Verwandte Themen