Unterschied zwischen privater, öffentlicher und geschützter Vererbung

Was ist der Unterschied zwischen public, private und protected Vererbung in C++? Alle Fragen, die ich auf SO gefunden habe, beziehen sich auf spezielle Fälle.

Lösung

Um diese Frage zu beantworten, möchte ich die Accessors der Mitglieder zunächst mit meinen eigenen Worten beschreiben. Wenn Sie dies bereits wissen, können Sie mit der Überschrift "Weiter" fortfahren.

Es gibt drei Accessoren, die mir bekannt sind: public, protected und private.

Lassen:

class Base {
    public:
        int publicMember;
    protected:
        int protectedMember;
    private:
        int privateMember;
};
  • Alles, was Base kennt, weiß auch, dass Base publicMember enthält.
  • Nur die Kinder (und deren Kinder) wissen, dass Base protectedMember enthält.
  • Niemand außer Base ist sich des privateMember bewusst.

Mit "ist sich dessen bewusst" meine ich "die Existenz anerkennen und somit in der Lage sein, darauf zuzugreifen".

weiter:

Das Gleiche geschieht mit der öffentlichen, privaten und geschützten Vererbung. Betrachten wir eine Klasse Base und eine Klasse Child, die von Base erbt.

  • Wenn die Vererbung "öffentlich" ist, wissen alle, die Base und Child kennen, auch, dass Child von Base erbt.
  • Wenn die Vererbung geschützt ist, wissen nur Kind und seine Kinder, dass sie von Base erben.
  • Wenn die Vererbung privat ist, weiß niemand außer Kind von der Vererbung.
Kommentare (12)

Es hat damit zu tun, wie die öffentlichen Mitglieder der Basisklasse von der abgeleiteten Klasse ausgestellt werden.

  • public -> die öffentlichen Mitglieder der Basisklasse sind öffentlich (normalerweise der Standard)
  • protected -> die öffentlichen Mitglieder der Basisklasse sind geschützt
  • private -> die öffentlichen Mitglieder der Basisklasse sind privat

Wie litb anmerkt, handelt es sich bei der öffentlichen Vererbung um die traditionelle Vererbung, die man in den meisten Programmiersprachen findet. Das heißt, sie modelliert eine "IS-A"-Beziehung. Private Vererbung, etwas, das AFAIK nur in C++ vorkommt, ist eine "IMPLEMENTED IN TERMS OF"-Beziehung. Das heißt, man möchte die öffentliche Schnittstelle in der abgeleiteten Klasse verwenden, aber nicht, dass der Benutzer der abgeleiteten Klasse Zugriff auf diese Schnittstelle hat. Viele argumentieren, dass man in diesem Fall die Basisklasse aggregieren sollte, d.h. anstatt die Basisklasse als private Basis zu haben, sollte man ein Mitglied der abgeleiteten Klasse einfügen, um die Funktionalität der Basisklasse wiederzuverwenden.

Kommentare (2)

Es handelt sich im Wesentlichen um den Zugriffsschutz der öffentlichen und geschützten Mitglieder der Basisklasse in der abgeleiteten Klasse. Bei der öffentlichen Vererbung kann die abgeleitete Klasse die öffentlichen und geschützten Mitglieder der Basisklasse sehen. Bei privater Vererbung ist das nicht der Fall. Bei protected können die abgeleitete Klasse und alle von ihr abgeleiteten Klassen sie sehen.

Kommentare (0)