Öffentliche und private Vererbung in C++
Wie wir wissen aus der Literatur, die für die öffentliche Vererbung das Objekt der Kind-Klasse (sub-Klasse) kann auch als Objekt der Basisklasse (super-Klasse). Warum das Objekt der sub-Klasse kann nicht als ein Objekt betrachtet werden, der super-Klasse, wenn die Vererbung ist protected oder private?
Hmm, deine Frage ist unklar. Wenn Sie eine Klasse, die erbt, und eine andere Klasse, die erbt Klasse ist ein Objekt seiner Oberklasse. Das ist die grundlegende definition von Polymorphismus.
Naja, welche Methoden würden Sie der Lage sein, auf ein solches Objekt?
Sie irren in zweierlei Hinsicht. 1. Private Vererbung nicht-Modell-eine Beziehung, und Sie können nicht mit einem privat-als Unterklasse einer Oberklasse. 2. Es ist nicht die definition von Polymorphismus. Lesen Sie dieser. I. e. Vorlagen sind sicherlich polymorphe, aber Sie haben nichts zu tun mit der Vererbung.
ONeal: Sie sind leicht schief auf 1. Siehe meine aktualisierte Antwort unten.
Es scheint davon abzuhängen, was wir "bedeutet" Erben der Schnittstelle". Wenn man von der externen Kunden-Perspektive, es ist wahr. Wenn man von der Klasse selbst (oder Ihrer Unterklassen, die ich würde sagen die Kunden sind von der Klasse auch) es ist nicht korrekt, da die geerbte Schnittstelle können frei verwendet werden, als solche.
Naja, welche Methoden würden Sie der Lage sein, auf ein solches Objekt?
Sie irren in zweierlei Hinsicht. 1. Private Vererbung nicht-Modell-eine Beziehung, und Sie können nicht mit einem privat-als Unterklasse einer Oberklasse. 2. Es ist nicht die definition von Polymorphismus. Lesen Sie dieser. I. e. Vorlagen sind sicherlich polymorphe, aber Sie haben nichts zu tun mit der Vererbung.
ONeal: Sie sind leicht schief auf 1. Siehe meine aktualisierte Antwort unten.
Es scheint davon abzuhängen, was wir "bedeutet" Erben der Schnittstelle". Wenn man von der externen Kunden-Perspektive, es ist wahr. Wenn man von der Klasse selbst (oder Ihrer Unterklassen, die ich würde sagen die Kunden sind von der Klasse auch) es ist nicht korrekt, da die geerbte Schnittstelle können frei verwendet werden, als solche.
InformationsquelleAutor Narek | 2011-01-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil Sie es nicht sehen können:
So dass Sie nicht verwenden können, eine PrivateDerived Objekt, in dem ein Base-Objekt benutzt werden könnte.
So wird es nie handeln wie ein Basis-Objekt-Klasse.
InformationsquelleAutor Martin York
Im Allgemeinen finden Sie in der Literatur (und auch in anderen Antworten hier), dass
protected
/private
Vererbung impliziert, dass die Klasse nicht genutzt werden kannbase
. Die Tatsache (einige andere Antwort Hinweise in diesem) ist, dass nur die Sichtbarkeit der Vererbung die von dem Vorgang betroffen. Diederived
Klasse ist einebase
Klasse, auch wenn externe code kann nicht sehen.Jede
friend
oder die Klasse wird in der Lage sein, um nutzen aus der Beziehung:Nun, technisch gesehen ist dies der Fall, semantisch, wenn Sie verwenden
private
erbschaft, die Sie versuchen zu modellieren, nicht einis-a
sondern eineimplemented-in-terms-of
Beziehung. Dies ist der wichtige Teil: beim Lesen von code, wenn Sie sehenprivate
Vererbung sollten Sie nicht denken, auf ist-ein aber umgesetzt-in-Bezug-von.InformationsquelleAutor David Rodríguez - dribeas
Dem "warum" ist einfach, wenn man bedenkt, wie der Mechanismus funktioniert: da protected und private-Vererbung gemeint sind, funktionieren auf diese Weise.
Dies ist wahrscheinlich nicht genug, um die Frage zu beantworten Absicht obwohl. Könnte man Fragen: "und warum haben private und geschützte Vererbung, wenn Sie nicht verwenden können, die resultierenden Objekte als Instanzen der Basis-Klasse?"
Gut, nicht-öffentliche Vererbung gemeint ist, zu erleichtern "ist implementiert mit" - Beziehung zwischen zwei Klassen (in der Erwägung, dass öffentliche Vererbung erleichtert die "ist-ein" - Beziehung). In anderen Worten, Sie wollen die Wiederverwendung von teilen oder allen der base-class-Funktionalität zum bereitstellen von Diensten für Ihren eigenen Verbrauchern.
Diesem Szenario ist fast immer besser umgesetzt durch aggregation statt Vererbung (d.h., dass ein member-Objekt der "Basis" - Klasse), und ich würde so weit gehen zu sagen, dass nicht-öffentliche Vererbung ist etwas besser allein gelassen.
Werfen Sie einen Blick auf diese für eine längere schreiben-up, das sich auf der oben.
Update: als die Kommentatoren unten Stand, gibt es einige (zugegebenermaßen seltenen) Fällen, in denen nicht-öffentliche Vererbung bietet den Mechanismus für die architektonische Funktionalität, die sonst nicht möglich sein. Lesen Sie, wie die Erkundung der Ränder einer Sprache kann sehr erhellend. Aber versuchen Sie, es zu tun, so wenig, wie du nur kannst.
Es gibt ein paar Fälle, in denen private Vererbung ist nützlich, d.h.
noncopyable
. Aber diejenigen sind wenige und weit zwischen.Ich denke, dass die Einnahme es zu weit. Wenn die Basis leer ist, dann kann Sie nicht haben einen Status. Wenn es kein Staat ist, warum ist nicht alles
static
? Und wenn es allestatic
, warum Sie brauchen, um zu Erben (andere als dienoncopyable
Fall)?siehe policy-based-design, aber ich Stimme zu, es ist technisch ein Grenzfall
Es wird mit den Vorlagen, wo Sie wollen, dass die EBO zu gelten, aber nicht wissen, wie die Klasse sein wird. Politik sind die wichtigsten, aber es gilt auch für Container wie std::list: der einzige wichtige Staat der value_type werden kann-Objekt-id (Adresse), das erfordert keine Daten-member.
InformationsquelleAutor Jon
Kurz, weil die private Vererbung ist die Vererbung von Umsetzung, nicht, dass der Schnittstelle. Eine private Unterklasse
Derived
Objekt ist nicht einBase
, aber ist implementiertBase
. Die public-und protected-member vonBase
sichtbar sind für dieDerived
, aber Sie werden private, damit unerreichbar für die Außenwelt. Damit private Vererbung gedacht werden kann als eine Besondere form der Zusammensetzung, das ist in der Tat selten in der Praxis ankommt. (Und protected-Vererbung ist praktisch nie - in der Tat wohl auch Bjarne Stroustrup, die nicht wissen, was geschützt Vererbung bedeutet).InformationsquelleAutor Péter Török
public
Vererbung dient dem Zweck, die ist-ein-Beziehung. Das heißt:private
Vererbung dient dem Zweck, die hat-ein-Beziehung. Sie können schreiben, fast jede Klasse mit privater Vererbung mit einem container-Modell statt:kann umgeschrieben werden (und mehr als oft nicht, sollten neu geschrieben werden, für die Klarheit):
protected
Vererbung ist ähnlichprivate
, aber in der Wirklichkeit fast nie verwendet werden (Scott Meyers und Herb Sutter, beide begründen dies in Ihren jeweiligen Büchern).InformationsquelleAutor Zac Howland
Können Sie denken public /protected /private-Vererbung wie die Zugänglichkeit für alle Schüler : es ist eine Frage des 'wie viel Sie zeigen wollen'.
Eine private (oder protected, in einer etwas anderen Weise) Vererbung ist eine Beziehung, die nicht gezeigt wird, die außerhalb der Welt. Als solche können Sie nicht behandeln, ein Objekt mit einem abgeleiteten Typ als seine private Basis, weil Sie nicht bekommen, um zu "sehen", dass diese Beziehung überhaupt existiert.
InformationsquelleAutor icecrime
Es kann sicherlich als ein Objekt von der super-Klasse. Doch eine solche Betrachtung ist beschränkt (durch die public/protected/private inhertiance modifier) , aber nur durch sich (private Vererbung) oder es ist sub-Klassen (protected-Vererbung).
Alle externen Objekte sind nicht erlaubt, gilt die Klasse als solche, ähnlich wie die, die Sie nicht zugreifen dürfen, protected oder private Methoden oder Variablen. Die Analogie ist eher passend, wenn richtig ausgedrückt.
So, die Klasse selbst, Ihre Unterklassen (und Freunde) sehen dies als eine ist-ein Beziehung, aber die Außenwelt ist nicht zulässig, dies zu tun.
Der folgende code zeigt diese in Aktion:
Beachten Sie, dass es egal ist, wie die xxxSubClass-Klassen leiten sich von Ihrer super-Klassen. Es geht darum, wie der super-Klassen stammen von der Basis, die ist, wie es sein sollte.
Der compiler meckert entsprechend:
Sicher, es kann. Siehe beigefügten code kompiliert mit VS 2008.
Diese Antwort korrekt angezeigt wird. Wo ist der Fehler?
Finden Sie die
main
Methode. Beachten Sie, dass es ein Fehler ist, zu behandeln, die entweder von den als Unterklassen einer Oberklasse. Deshalb sagen: "es kann sicherlich als ein Objekt von der super-Klasse", wenn es offensichtlich nicht so behandelt, ist nicht sinnvoll. Wenn Sie Erben privat, Sie Erben nicht die Oberklasse " - Schnittstelle. Daher die Unterklasse kann nicht behandelt werden wie ein Superklasse. Das casting geht in die Unterklassen sinnvoll, da die Sie implementieren können, in Bezug auf die privat vererbt Klasse, aber die Kunden (d.h.main
hier) nicht tun.Ich würde argumentieren, dass Sie Erben die Schnittstelle bei der privaten Umsetzung, aber die Vererbung ist nur für die Klasse, nicht die Kunden. Sie sagen, dass dies die gleiche Sache wie nicht Erben die Schnittstelle, da die clients können es nicht verwenden. Es ist eine Frage der Perspektive, aber der Wortlaut "kann nicht behandelt werden wie ein Oberklasse" kommen sollte, mit der Ausnahme "- außer in der Klasse selbst" (und etwas ähnliches für die protected-Vererbung) werden vollständig richtig, IMO.
InformationsquelleAutor Macke