Tun Sub-Klassen Wirklich Erben, Die Private Member-Variablen?
Im Grunde, soweit ich weiß, beim erstellen einer Basis-Klasse mit einer public, protected und private-Abschnitt und die Variablen/Funktionen in den einzelnen der öffentlichen und geschützten Bereiche vererbt bekommen in dem entsprechenden Abschnitt der sub-Klasse (definiert durch Klasse : Unterklasse: private Basis, die alle öffentlichen und geschützten Mitglieder-Basis und legen Sie Sie in der öffentlichkeit, das Wort verändert, privat zu öffentlich stellt Sie alle in den öffentlichen und ändern Sie ihn auf geschützt setzt Sie alle in die geschützten).
Also, wenn Sie erstellen eine sub-Klasse, die Sie nie erhalten nichts von den private-Abschnitt der vorhergehenden Klasse (der Basisklasse, in diesem Fall), wenn das wahr ist dann ein Objekt der sub-Klasse sollte nie seine eigene version von einer privaten variable oder Funktion aus der Basisklasse korrekt?
Laufen wir über ein Beispiel:
#include <iostream>
class myClass //Creates a class titled myClass with a public section and a private section.
{
public:
void setMyVariable();
int getMyVariable();
private:
int myVariable; //This private member variable should never be inherited.
};
class yourClass : public myClass {}; //Creates a sub-class of myClass that inherits all the public/protected members into the
//public section of yourClass. This should only inherit setMyVariable()
//and getMyVariable() since myVariable is private. This class does not over-ride any
//functions so it should be using the myClass version upon each call using a yourClass
//object. Correct?
int main()
{
myClass myObject; //Creates a myClass object called myObject.
yourClass yourObject; //Creates a yourClass object called yourObject
yourObject.setMyVariable(); //Calls setMyVariable() through yourObject. This in turn calls the myClass version of it because
//there is no function definition for a yourClass version of this function. This means that this
//can indeed access myVariable, but only the myClass version of it (there isn't a yourClass
//version because myVariable is never inherited).
std::cout << yourObject.getMyVariable() << std::endl; //Uses the yourClass version of getMyVariable() which in turn
//calls the myClass version, thus it returns the myClass myVariable
//value. yourClass never has a version of myVariable Correct?
std::cout << myObject.getMyVariable() << std::endl; //Calls the myClass version of getMyVariable() and prints myVariable.
return 0;
}
void myClass::setMyVariable()
{
myVariable = 15; //Sets myVariable in myClass to 15.
}
int myClass::getMyVariable()
{
return myVariable; //Returns myVariable from myClass.
}
Nun, in der Theorie, basierend auf was ich denke, das gedruckt werden soll:
15
15
Aufgrund es einfach immer mit der myClass-version der Funktionen (also mit der myClass myVariable). Aber, seltsamerweise, dies ist nicht der Fall. Das Ergebnis der Ausführung dieses Programm druckt:
15
0
Das macht mich Frage mich, sind wir eigentlich nicht nur Erben myVariable, aber wir haben auch die Fähigkeit, mess around mit ihm? Klar ist das erstellen einer alternativen version von myVariable irgendwie sonst gäbe es nicht eine 0 für das myClass-version. Wir sind in der Bearbeitung eine zweite Kopie von myVariable durch all dies tun.
Kann mir bitte jemand erklären, diese alle zu mir, dies zerrissen hat mein Verständnis der Vererbung.
InformationsquelleAutor der Frage TorbenC | 2013-01-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es ein wenig Verwirrung in dieser Aussage.
Erinnern, dass die Vererbung definiert ist, für Klassen und Strukturen in C++. Einzelne Objekte (zB. Instanzen) Erben nicht von anderen Objekten. Konstruktion eines Objekts mit anderen Objekten aufgerufen wird Zusammensetzung.
Wenn eine Klasse von einer anderen Klasse erbt, es wird alles von dieser Klasse, aber der Zugriffsrechte der geerbten Felder hemmen kann, Ihre Verwendung innerhalb der Erbe.
Außerdem, es gibt 3 Arten von Vererbung für Klassen:
private
(das ist der Standard),protected
undpublic
. Jeder von Ihnen ändert die Zugriffsebene, von der eine Klasse Eigenschaften und Methoden, wenn Sie von einer Unterklasse geerbt.Wenn wir, um die Zugriffsberechtigungen, die in dieser Weise:
public
protected
private
aus den am wenigsten geschützt, die am meisten geschützt ist, dann können wir definieren, das Erbe Modifikatoren wie die Erhöhung der Zugriffsberechtigungen der geerbten Klasse Felder mindestens die Stufe, die Sie bezeichnen, in der abgeleiteten Klasse (dh. die Klasse erbt).Zum Beispiel, wenn die Klasse
B
erbt von der KlasseA
mit derprotected
inheritance modifier:dann alle Felder aus
A
müssen mindestens dieprotected
Ebene inB
:public
Felder werdenprotected
(public
Niveau angehoben wird, um zuprotected
),protected
Felder bleibenprotected
(gleiche Zugriffsberechtigung, so dass keine änderung hier),private
Felder bleibenprivate
(access level bereits über der Modifikator)InformationsquelleAutor der Antwort didierc
"Wenn Sie erstellen eine sub-Klasse, die Sie nie erhalten nichts von den private-Abschnitt der [base class]. Wenn das wahr ist dann ein Objekt der sub-Klasse sollte nie seine eigene version von einer privaten variable oder Funktion aus der Basisklasse, richtig?"
Nicht. Die abgeleitete Klasse erbt alle Elemente der Basisklasse, einschließlich die privaten. Ein Objekt der geerbten Klasse hat private Mitglieder, aber nicht direkten Zugang zu Ihnen. Es hat Zugriff auf die öffentlichen member der Basisklasse, kann der Zugriff auf diese Mitglieder, aber Sie (die abgeleitete Klasse) darf keine neuen member-Funktionen die mit einem solchen Zugang:
InformationsquelleAutor der Antwort Beta
myObject
undyourObject
sind zwei verschiedene Objekte! Warum sollten Sie teilen alles?Denken Sie es so: Vergessen Sie die erbschaft-und angenommen, Sie haben eine Klasse
Person
mitprivate int age;
undpublic void setAge (int age) {...}
. Sie dann instantiiere zwei Objekte:Würden Sie erwarten, dass Bill zu 35 jetzt auch? Sie würde nicht, richtig? Ähnlich, Ihr
myObject
nicht teilen, seine Daten mityourObject
.In Antwort auf Ihren Kommentar:
Klasse
yourClass
erbt vonmyClass
. Das bedeutet, dass beideyourObject
undmyObject
haben Ihre eigenenmyVariable
die letztere natürlich per definition die ehemaligen geerbt vonmyClass
.InformationsquelleAutor der Antwort us2012
Körperlich, jedes einzelne Mitglied( einschließlich der member-Funktionen) des Basis-Klasse geht in die Unterklasse. Egal, ob Sie privat sind. Egal, ob Sie Erben, Ihnen öffentlich/geschützt ly/privat. Also in deinem Beispiel
yourClass
enthält alle dreigetMyVariable()
setMyVariable()
undmyVariable
. All dies ist ziemlich einfach, okay?Was zählt, ist, wie wir auf Sie zugreifen können. Es ist, wie wenn eine Datei gelöscht wird, auf Ihrem system. Also, sollten Sie zuerst verstehen den Unterschied zwischen einem Mitglied, das nicht da ist und ein Mitglied da ist, aber unzugänglich. Vermuten jetzt, dass alle die Vererbung erfolgt öffentlich. Dann, alle öffentlichen member der Basisklasse public sind, in der abgeleiteten Klasse protected member werden protected und private Mitglieder nicht zugänglich sind. Sie sind unzugänglich und nicht nicht-existent, da es einige member-Funktionen im geschützten und öffentlichen Bereichen in der Basis-Klasse, die Zugriff auf private Mitglieder der Basisklasse. Wir müssen also alle diese privaten Mitglieder-Basis, die Zugriff auf public-und protected-member-Funktionen von base, die für Ihre Funktionalität. Da es keine Möglichkeit gibt, können wir bestimmen, welches Element benötigt wird, indem die member-Funktion in einer einfachen Art und Weise, wir sind alle private member der Basisklasse in der abgeleiteten Klasse. All dies bedeutet einfach, dass in einer abgeleiteten Klasse, einen privaten member kann geändert werden, nur durch die Basis-Klasse " member-Funktionen.
Hinweis: jedes private Mitglied zugegriffen werden, die direkt oder indirekt [durch eine weitere private member-Funktion, die wiederum durch eine public/protected member-Funktion], die von einer öffentlichen/geschützten meber Funktion, sonst hat es keine Verwendung.
So, wir wissen bis jetzt, dass eine private member-variable der Basisklasse hat seine Verwendung in der abgeleiteten Klasse, d.h. für die Funktionalität der public/protected member-Funktionen. Aber Sie kann nicht direkt zugegriffen werden, in der Basis-Klasse.
Nun wenden wir unsere Aufmerksamkeit private - /public-Vererbung. Für öffentliche Vererbung bedeutet dies, dass alle erreichbaren Mitglieder der Basisklasse (also die public-und protected-Elemente) können nicht auf einer Ebene, die mehr erlauben, als öffentlich. Da public ist die permissive Ebene, der öffentlichen und geschützten Mitglieder öffentlich bleiben. Aber auf protected-und private-Vererbung, die beiden werden protected und private in der abgeleiteten Klasse, beziehungsweise. Im letzteren Fall, da alle diese Mitglieder sind private, Sie können nicht zugegriffen werden, weiter in der Hierarchie-Kette, aber zugegriffen werden kann, die durch den angegebenen abgeleiteten Klasse alle die gleichen.
Also jede Basis Klasse in der abgeleiteten Klasse ist die kleinere von deren Ebene in der abgeleiteten Klasse () und der Art der Vererbung (public/protected/private).
Gleiche Konzept gilt auch für die Funktionen außerhalb der Klasse. Für Sie private-und protected-Elemente nicht zugänglich sind, aber Sie existieren und können aufgerufen werden, indem die public-member-Funktionen.
Und nehmen Ihren Fall als letztes Beispiel,
setMyvariable()
undgetMyVariable()
zugreifen könnenmyVariable
in der abgeleiteten Klasse. Aber keine bestimmte Funktion in der abgeleiteten Klasse zugreifen könnenmyVariable
. Ändern Sie Ihre Klasse:Weiter: können Sie Ausnahmen hinzufügen, um die Art der Vererbung auch z.B. eine private Vererbung, außer ein Mitglied der öffentlichkeit zugänglich gemacht, die in der abgeleiteten Klasse. Aber das ist eine andere Frage zusammen.
InformationsquelleAutor der Antwort Anurag Kalia
Du nie rufen Sie
myObject.setMyVariable()
somyObject.getMyVariable()
wird nicht zurück 15.private
bedeutet nichtstatic
.InformationsquelleAutor der Antwort Oliver Charlesworth
Nach:
gibt es nur noch eine member-variable. Aber es gibt zwei Möglichkeiten, auf es beim Namen:
myClass::myVariable
undyourClass::myVariable
.In diesen Ausdrücken, der name der Klasse ist bekannt als die Benennung Klasse. Die zweite wichtige Sache zu verstehen ist, dass Zugriffsrechte gelten für die Kombination für die Benennung von Klassen-und member-Namen; nicht nur, um den Mitgliedsnamen und nicht die variable selbst.
Wenn ein Mitglied erwähnt, ohne ausdrücklich die Benennung der Klasse vorhanden ist, dann ist die Benennung der Klasse ist abgeleitet aus dem Typ des Ausdrucks auf der linken Seite des
.
oder->
benannten Mitglied (mitthis->
wird impliziert, wenn es keinen solchen Ausdruck).Außerdem gibt es ja vier mögliche Arten des Zugriffs:
public
protected
private
und keinen Zugang. Sie können nicht erklären, ein Mitglied als keinen Zugangaber diese situation entsteht, wenn ein privates Mitglied ist geerbt.Anwendung der Theorie auf dein Beispiel:
myClass::myVariable
istprivate
.yourClass::myVariable
ist keinen Zugang.Wiederholen, es ist eigentlich nur eine variable, aber es kann mit dem Namen auf zwei verschiedene weisen, und die Zugriffsrechte unterscheiden sich je nachdem, welcher name verwendet wird.
Schließlich wieder zu Ihrem ursprünglichen Beispiel.
myObject
undyourObject
sind verschiedene Objekte. Ich glaube, was Sie schreiben wollten, oder was Sie sind geistig vorzustellen, ist eigentlich diese situation:was bedeutet
myObject
Namen der Basis-Klasse TeilyourObject
. Dann nach:die variable
15
und soausgeben würde
15
weil es gibt ja nur eine variable.InformationsquelleAutor der Antwort M.M
Dies kann helfen,
InformationsquelleAutor der Antwort Anurag