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?
Antwort
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 file
nachfoo
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 { ... }
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.
Die Frage bezieht sich auf geschützte Vererbung, 'class a: protected b ', nicht über geschützte Mitglieder. –
Geschützte Erbschaft ist etwas, dessen Bedeutung mir bis heute entgeht.
Dies ist Scott Meyers Meinung (Effective C++, 3. Edition) auf geschützte Vererbung :). Diese Seite ist jedoch interessant: Effective C++: discouraging protected inheritance?.
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.
Die Frage bezieht sich auf geschützte Vererbung, 'Klasse a: protected b', nicht über geschützte Mitglieder. –
- 1. In welchen Fällen müssen wir <cassert> einschließen?
- 2. In welchen Fällen verwenden wir native Abfrage und HQL-Abfrage?
- 3. In welchen Fällen sind Ausdrucksbäume nützlich?
- 4. In welchen Fällen erstellt Oracle automatisch Indizes?
- 5. Wenn die HeapCreate-Funktion verwendet wird oder in welchen Fällen benötigen Sie eine Reihe von Heaps?
- 6. in welchen Fällen nicht scala richtig konvertieren String zu java.lang.String
- 7. In welchen Fällen gibt die Process.Start() -Methode false zurück?
- 8. In welchen Fällen muss Future.get() throw ExecutionException oder InterruptedException
- 9. Welchen Performance Overhead benötigen IoC-Container?
- 10. Warum benötigen wir Laufzeitklasseninformationen in MFC?
- 11. unter welchen Fällen wäre LDAP vorzuziehen als Datenbank
- 12. Benötigen wir Oracle 11g Client, wenn wir SQL Developer verwenden?
- 13. in welchen Fällen Speicher ist Byte oder Wort adressierbar und warum
- 14. Benötigen wir web.xml für REST-Dienste?
- 15. In welchen Fällen kann der Benutzer Berechtigungen (Laufzeit) widerrufen? (in Activity Lifecycle)
- 16. In welchen Fällen muss ich eine Variable vom gleichzeitigen Zugriff sperren?
- 17. In welchen Fällen muss ich zwei verschiedene Erweiterungsmethoden für IEnumerable und IQueryable erstellen?
- 18. In welchen Zertifikatsspeicher sollten wir die Zertifikate des Servers setzen
- 19. In welchen Fällen testen Sie anstelle einer Entwicklungsdatenbank eine In-Memory-Datenbank?
- 20. In welchen Fällen ist @finally nicht redundant in Cocoa's try/catch/finally Exception Handling?
- 21. In welchen Fällen wäre es nützlich, einen Befehl in eine Java For-Loop-Aktualisierungsanweisung aufzunehmen?
- 22. In welchen Fällen gibt "Select count (*)" vs. "Select count (*) AS" in PostgreSQL andere Ergebnisse?
- 23. Warum benötigen wir keine Schnittstellen in dynamischen Sprachen?
- 24. Wert Check in 4 Fällen
- 25. "geschützte" Methoden in C#?
- 26. Geschützte Klassenstruktur in Java?
- 27. Geschützte Funktionen in Scala
- 28. Geschützte Gleichungen in Haskell
- 29. In welchen Fällen kann die eloquente Sammlung des Laravel speichern() schiefgehen?
- 30. Formschöner Schnittpunkt der Geometrie - in welchen Fällen würden sich ein Linienstring und ein Polygon schneiden?
'giveы': Hallo aus Russland :) – iehrlich
Verwandte: [geschützte Vererbung] (http: // Stackoverflow .com/questions/2090661/protected-vererbung) – ipc
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. –