C ++ warum öffentliche, private oder geschützte Vererbung verwenden?

8

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?

    
Tim 19.01.2013, 12:18
quelle

4 Antworten

8

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.

    
TemplateRex 19.01.2013, 12:28
quelle
1

Es geht nur um Datenkapselung .

Ссылка

Kapselungskonzept

Es ist gut, die internen Daten Ihrer Klassen vor anderen Klassen zu schützen. Vorteile umfassen:

  • andere Klassen müssen die bekannten richtigen Zugriffsmechanismen (z. B. Methoden) durchlaufen, um auf Ihre Klasse zuzugreifen, und können nicht direkt mit den Interna Ihrer Klasse umgehen (und somit Ihre Klasse möglicherweise in einen unbekannten und defekten Zustand versetzen)
  • Sie können die inneren Abläufe Ihrer Klasse ändern und wissen, dass andere Klassen dadurch nicht brechen
  • Durch das Reduzieren sichtbarer externer Kontaktpunkte mit einer Klasse werden Ihre Klassen einfacher zu verwenden und zu verstehen.

Wenn Sie die Option " protected " anstelle von " private " verwenden, wird Ihr Code durch die Unterklassenerweiterung einfacher erweitert.

    
occulus 19.01.2013 12:22
quelle
0

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.

    
Agentlien 19.01.2013 12:35
quelle
0

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%     
quelle