Appeler un constructeur de la classe de base à partir d'une sous-classe de " corps du constructeur
J'étais sous l'impression que c'est impossible, voir par exemple:
Appeler le constructeur de la classe de base après quelques autres instructions en C++
Mais le programme fonctionne et produit des deux lignes de "Constructeur de Personne":
#include <iostream>
class Person
{
public:
Person()
{
std::cout << "Constructor Person" << std::endl; }
};
class Child : public Person
{
public:
Child()
{
c = 1;
Person();
}
int c;
};
int main()
{
Child child;
return 0;
}
Le premier est un appel implicite du constructeur par défaut, c'est clair. Ce qui sur le 2ème - t-il dire que l'action décrite dans le titre est-il légitime? J'utilise Visual C++ 2010.
Ainsi, selon les réponses/commentaires ci-dessous, la réponse est: il faut comprendre précisément le sens de "l'Appel d'un constructeur de B de la classe de base à partir d'une sous-classe D corps du constructeur". Constructeur de B ne peut pas être appelé de telle sorte qu'il crée de la part du parent de cet objet enfant. Merci tout le monde!
OriginalL'auteur TT_ | 2014-01-28
Vous devez vous connecter pour publier un commentaire.
L'appel à l'intérieur de l'enfant, le constructeur de la classe n'est pas d'appeler le constructeur de classe de base, c'est la création d'un temporaire, sans nom et un nouvel objet de type Personne. Il sera détruit comme le constructeur sort. Pour clarifier, votre exemple est le même que pour ce faire:
Sauf que dans ce cas, l'objet temporaire a un nom.
Vous pouvez voir ce que je veux dire, si vous modifiez votre exemple un peu:
Ce produit de la sortie:
Person();
dans mon ou vos exemples ne sont pas constructeur appelle, quand exactement ce que les gens veulent dire quand puis dire: on ne peut pas appeler le constructeur de base de la sous-classe constructeur?Ils signifient que vous ne pouvez pas l'appeler sur un objet. La valeur du pointeur "this" lors de votre constructeur Personne exécute le deuxième temps sera totalement différent de le pointeur "this" la première fois qu'il s'exécute. Car la deuxième fois, il est juste d'appeler le constructeur sur un temporaire, sans rapport avec l'objet.
que mon 2ème appel du constructeur n'a rien à voir avec la construction de la mère de l'enfant. Cela fait sens. Il semble que la terminologie n'est pas assez précis.
OriginalL'auteur zdan
Vous ne pouvez pas appeler à partir du corps de l'enfant du constructeur, mais vous pouvez le mettre dans la liste d'initialiseur:
Bien sûr, il n'est pas utile d'appeler le constructeur par défaut de la mère, parce que cela va se faire automatiquement. Il est plus utile si vous avez besoin pour passer un paramètre au constructeur.
La raison pour laquelle vous ne pouvez pas appeler le constructeur du corps, c'est parce que le C++ garantit le parent sera achevé la construction de l'enfant et le constructeur commence.
Vous êtes juste à l'instanciation d'un temporaire de la Personne objet de l'appel à
Person();
. Il n'a rien à voir avec l'objet Enfant qui est actuellement en cours de construction (à l'exception, bien sûr, pour être appelée à partir de l'Enfant du constructeur de l'objet).Je ne pense pas que c'est en fait d'appeler le constructeur, au moins pas pour l'objet qui vous intéresse.
Et encore une fois, il ne répond pas à la question. Je ne demande pas au sujet des effets secondaires, la question est: pourquoi ce code fonctionne?
non, je ne peux pas produire un tel exemple parce que la création d'un objet temporaire est parfaitement OK. Il n'a tout simplement pas accomplir ce que vous attendez.
OriginalL'auteur Mark Ransom
Ce qui suit est un extrait de "Accelerated C++":
"Objets dérivés sont construits par:
1. Allocation d'espace pour la totalité de l'objet (de la classe de base des membres ainsi que les membres de classe dérivée);
2. L'appel de la classe de base constructeur pour initialiser la classe de base de la partie de l'objet;
3. Initialisation des membres de la classe dérivée comme indiqué par le constructeur de l'initialiseur;
4. L'exécution du corps de la dérivée constructeur de la classe, le cas échéant."
Résumant les réponses et commentaires: l'Appel d'un constructeur de la classe de base à partir d'une sous-classe de " corps du constructeur qui est impossible dans le sens que #2 ci-dessus doit précéder #4.
Mais nous avons toujours la possibilité de créer un objet de base dans le dérivé corps du constructeur donc d'appeler un constructeur de base. Il sera un objet différent de l'objet en cours de construction avec le cours d'exécution dérivés constructeur.
OriginalL'auteur TT_