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.
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;
};
Base
kennt, weiß auch, dass Base
publicMember
enthält.Base
protectedMember
enthält.Base
ist sich des privateMember
bewusst.Mit "ist sich dessen bewusst" meine ich "die Existenz anerkennen und somit in der Lage sein, darauf zuzugreifen".
Das Gleiche geschieht mit der öffentlichen, privaten und geschützten Vererbung. Betrachten wir eine Klasse Base
und eine Klasse Child
, die von Base
erbt.
Base
und Child
kennen, auch, dass Child
von Base
erbt.geschützt
ist, wissen nur Kind
und seine Kinder, dass sie von Base
erben.privat
ist, weiß niemand außer Kind
von der Vererbung.Es hat damit zu tun, wie die öffentlichen Mitglieder der Basisklasse von der abgeleiteten Klasse ausgestellt werden.
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.
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.