Confondu avec l’inheritance C ++

Je suis tellement confus avec la sortie du code suivant:

#include  using namespace std; class Parent { public: Parent() : x(2) { } virtual ~Parent() { } void NonVirtual() { cout << "Parent::NonVirtual() x = " << x << endl; } private: int x; }; class Child : public Parent { public: Child() : x(1) { } virtual ~Child() { } void NonVirtual() { cout << "Child::NonVirtual() x = " << x <NonVirtual(); // Output: Parent::NonVirtual() x = 2 // Question: are there two x'es in the Child object c? // where is x = 2 from (we have not defined any Parent object)? cout << sizeof(c) << endl; cout << sizeof(*p) << endl; return 0; } 

Le code ci-dessus illustre le fait qu’en C ++, seules les fonctions marquées virtual sont remplacées . Ce que vous avez ici éclipse , ne prime pas. En cas de substitution et d’inheritance, le comportement est basé sur le type d’exécution qui correspond au comportement d’inheritance normal auquel vous vous attendez, mais si vous ne le déclarez pas virtuel, il repose uniquement sur le type de compilation (c’est-à-dire le type déclaré). Puisque p est déclaré de type Parent *, il utilise l’implémentation dans Parent, alors que c est déclaré de type Child et utilise donc la version donnée par le type Child. Si vous déclariez la méthode virtuelle, dans les deux cas, elle rechercherait la version appropriée de la fonction au moment de l’exécution et invoquerait la version indiquée dans la classe Child.

Je devrais également append que vous avez deux variables x différentes … si vous souhaitez partager des variables entre une classe de base et une classe dérivée, vous devez la marquer “protégée” dans la classe de base (bien que je dirais qu’elle est généralement mauvaise concevoir pour le faire). La variable x que vous déclarez dans Child est une variable différente de celle de Parent. Rappelez-vous que x est privé dans Parent et que le nom x n’avait donc aucune signification dans Child jusqu’à ce que vous ayez créé une deuxième variable nommée x dans Child.

Il n’y a rien à confondre ici. Lorsque vous appelez une fonction non virtuelle, quel que soit le type atsortingbué, les méthodes de ce type sont appelées.

Ici, le parent * p et l’adresse de l’enfant sont les mêmes, mais l’atsortingbution appartient au parent. Ainsi, toutes les méthodes non virtuelles invoquent les méthodes du parent et non celles de l’enfant.

N’oubliez pas que lorsque vous utilisez l’inheritance (en particulier public), l’enfant dérive automatiquement toutes les méthodes et tous les membres du parent. Ainsi, même si vous affectez le pointeur de l’enfant, l’atsortingbution est effectuée selon le type du parent.

La seule chose à vérifier est de ne pas supprimer P ici car P et l’enfant C partagent la même adresse.