Ne Sous-Classes Vraiment Hériter Des Variables De Membre Privé?

Fondamentalement, autant que je sache, lorsque vous créez une classe de base avec un public, protected et private section et les variables/fonctions de chaque public et protégé par des sections avoir hérité dans la section appropriée de la sous-classe (définie par la classe sous-classe : privé de base, qui aura tout public et protégé les membres de la base et de les mettre en public, de changer le mot du privé au public les met tous dans le public et de le changer pour protégé les met tous dans protégé).

Ainsi, lorsque vous créez une sous-classe, vous de ne jamais rien recevoir de la partie privée de la classe précédente (la classe de base dans ce cas), si cela est vrai, alors un objet de la sous-catégorie ne devrait jamais avoir sa propre version d'une variable privée ou la fonction de la classe de base correcte?

Arrêtons-nous sur un exemple:

#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.
}

Maintenant, en théorie, fondée sur ce que je pense, cela devrait afficher:
15
15
En raison de cela simplement en utilisant toujours le myClass version de fonctions (donc à l'aide de la myClass mavariable). Mais, étrangement, ce n'est pas le cas. Le résultat de l'exécution de ce programme imprime:
15
0
Cela me fait me demander, sommes-nous en réalité pas seulement hériter mavariable, mais ne nous ont également la possibilité de s'amuser avec elle? Clairement, c'est la création d'une version alternative de mavariable en quelque sorte, sinon il n'y aurait pas un 0 pour le myClass version. Nous sommes en effet à l'édition d'un second exemplaire de mavariable en faisant tout cela.

Quelqu'un peut-il m'expliquer ce tout pour moi, cela a déchiré ma compréhension de l'héritage.

  • Pourriez-vous s'il vous plaît corriger l'indentation de ton code?
  • myObject.getMyVariable() est un comportement indéterminé.
  • Vous n'appelez jamais myObject.setMyVariable. C'est donc un codage simple bug; rien à voir avec l'héritage!
  • Je pense que c'est peut-être une certaine confusion à propos de la distinction entre les classes et les objets et l'idée fausse que cette distinction en quelque sorte disparaît dès que vous utilisez l'héritage.
InformationsquelleAutor TorbenC | 2013-01-11