Nun, es gibt genug Informationen zu diesem Thema. Zum Beispiel war dieser Thread sehr klar für mich: Unterschied zwischen privaten, öffentliches und geschütztes Erbe
Außer einem Punkt; Warum ist es nützlich?
Verwenden Sie die öffentliche Vererbung , um eine is-a-Beziehung widerzuspiegeln. Dies ist die Hauptverwendung für die Vererbung, insbesondere in Kombination mit virtuellen Funktionen. Es erlaubt die Wiederverwendung der Schnittstelle, nicht nur von altem Code durch neuen Code, sondern auch Wiederverwendung von neuem Code durch alten Code! (wegen der virtuellen Funktionszuteilung zur Laufzeit).
Verwenden Sie in Ausnahmefällen die private Vererbung , um eine is-implemented-in-terms-of-Beziehung widerzuspiegeln. Dies ist ein häufig überstrapaziertes Muster, oft kann das entsprechende Ziel durch Komposition erreicht werden (mit der Möchtegern-Basisklasse als Datenelement). Ein weiterer Nachteil ist, dass Sie leicht mehrere Vererbung der gleichen Basisklasse (zweimal oder mehr entfernt) haben können, was zu dem sogenannten Diamond führt Problem .
Vermeiden Sie die Verwendung geschützter Vererbung . Dies legt nahe, dass Ihre Klassenschnittstelle mandantenabhängig ist (abgeleitete Klassen im Vergleich zur Welt). Dies liegt oft an Klassen mit mehreren Verantwortlichkeiten, was darauf hindeutet, dass ein Refactoring in separate Klassen angebracht ist.
Es geht nur um Datenkapselung .
Es ist gut, die internen Daten Ihrer Klassen vor anderen Klassen zu schützen. Vorteile umfassen:
Wenn Sie die Option " protected
" anstelle von " private
" verwenden, wird Ihr Code durch die Unterklassenerweiterung einfacher erweitert.
Die Antwort auf diese Frage betrifft Klassenschnittstellen und Datenkapselung statt Sprachfähigkeiten.
Die Anwendungsfälle der geschützten und privaten Vererbung sind eher begrenzt, da oft andere Optionen zur Verfügung stehen, die das Problem besser lösen (z. B. die Verwendung von Komposition und nicht die Vererbung). Es gibt jedoch Zeiten, in denen Sie unbedingt von einem Typ erben müssen (z. B. um mit einer Bibliothek eines Drittanbieters zu kommunizieren), aber bevorzugen Sie (aus Gründen, die mit Benutzeroberfläche Ihrer Klasse), um die meisten von der Basisklasse geerbten Member vor den Benutzern Ihres neuen Typs zu verbergen. Ein typisches Szenario wäre, wenn Ihr Typ die Mitgliedsfunktionen einer bestimmten Klasse für die interne Verwendung benötigt, aber dies würde die Logik Ihres neuen Typs unterbrechen, wenn er von außerhalb der Klasse selbst aufgerufen würde.
In diesen Situationen müssen Sie private
oder protected
vererbung verwenden (abhängig davon, ob die Schnittstelle in ähnlicher Weise auf weitere abgeleitete Klassen beschränkt sein soll oder nicht).
Bedenken Sie jedoch, dass dies alles nur (stark) auf die Benutzer Ihrer Klasse hinweist, wie sie es verwenden sollten. Sie passen seine öffentliche Schnittstelle an, um bestimmte Features zu verbergen, die in der Basisklasse öffentlich waren. Dies verhindert streng genommen nicht, dass Personen auf diese Mitglieder zugreifen, da jeder Benutzer immer noch einen Zeiger auf Ihre abgeleitete Klasse auf einen Zeiger auf die Basis werfen kann und die "versteckten" Ressourcen auf diese Weise erreichen kann.
Privat: Auf private Mitglieder einer Klasse kann nur von Klassenfunktionen, Konstruktoren und Destruktoren zugegriffen werden. Der Client, der Ihre Klasse verwenden wird, kann nicht darauf zugreifen. Wenn Sie zum Beispiel eine Listenklasse implementieren und die Größe der Liste verfolgen möchten, sollten Sie eine private Variable (zB listSizeP
) haben. Sie tun dies, weil Sie nicht möchten, dass der Client die Größe der Liste ändern kann, ohne Elemente einzufügen.
Öffentlich: öffentliche Mitglieder können auch vom Client aufgerufen werden. Im obigen Beispiel sollten Funktionen wie insert
und erase
öffentlich sein.
Geschützt: Geschützte Mitglieder einer Klasse, wie private Mitglieder, können nur von Klassenfunktionen aus erreicht werden, aber sie können auch auf Klassen zugreifen, die von dieser Klasse geerbt wurden (tatsächlich hängt es von der Art ab, wie die Die abgeleitete Klasse erbt die Basis. Wenn es sich nicht um eine öffentliche Vererbung handelt, kann die abgeleitete Klasse nicht auf die privaten Mitglieder der Basisklasse zugreifen. Aus diesem Grund ist die häufigste Art der Vererbung die öffentliche Vererbung. Beispiel:
%Vor%Tags und Links c++ inheritance protected public private