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

Schreibe einen Kommentar