C ++ - Dois-je appeler le constructeur par défaut de la classe de base dans la liste d'initialisation?
class A : public B
{
...
}
//case I : explicitly call the base class default constructor
A::A() : B()
{
...
}
//case II : don't call the base class default constructor
A::A() //: B()
{
...
}
Est le cas II égal cas je?
Pour moi, je suppose que le constructeur par défaut de la base de clasa B n'est PAS appelée dans le cas II.
Merci
///mise à jour ///
class B
{
public:
B()
{
cout << "B constructor" << endl;
}
};
class A : public B
{
public:
A()
{
cout << "A constructor" << endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A a;
return 0;
}
//sortie de VS2008
B constructor
A constructor
Press any key to continue . . .
source d'informationauteur q0987
Vous devez vous connecter pour publier un commentaire.
Le constructeur de classe de base est appelé dans les deux cas.
Ici est un lien un article avec plus d'info.
Si le constructeur de classe de base ne prend aucun argument, puis de mentionner expressément dans la liste d'initialisation n'est pas nécessaire.
Pour compléter l'expérience d'apprentissage et de développer une compréhension plus profonde, vous pouvez commencer à modifier un peu les choses. Par exemple, ce qui arrive quand
B
n'a pas de constructeur par défaut? Est-il même pas compiler? D'autres légères modifications de ce genre de fournir une excellente expérience d'apprentissage.Cela dit, dans mon expérience, il est généralement préférable de le faire
que
parce que le premier est plus explicite, et il va vous amener à réfléchir sur ce qui se passe vraiment avec la classe de base de l'initialisation. Vous aurez probablement éviter caché comportement par expliquer les choses de manière explicite.
Si
B
ne dispose pas d'un utilisateur déclaré constructeur, le comportement est différent. Comparer:Maintenant,
w.a
etw.b
sont garantis être de zéro. Si vous avez laissé l'initialisation explicite de la classe de base, ils auraient indéterminée valeurs.Il peut être inconnu pour vous dire que, en dépit de la syntaxe, l'utilisation de
SimpleAggregate()
ne pas appeler le constructeur par défaut, si. Simplement, il initialise la classe de base (nous avons plusieurs bonnes réponses ici sur Stackoverflow à propos de ce "initialisation de la valeur"), de ne pas appeler le constructeur par défaut car il n'y a aucun utilisateur déclaré.Chaque classe est dérivée d'une autre classe doit appeler la classe de base " du constructeur. Une classe dérivée ne peut être construits en une fois l'ensemble de la classe de base sont entièrement construits. Donc, il n'a pas d'importance si vous appelez de la classe de base' constructeur ou pas. Si vous n'appelez pas, tant qu'il y a un constructeur par défaut disponibles pour le compilateur pour le déterminer, il sera appelé. Sinon, le compilateur va jeter erreur.