En C++, il existe un concept de liste d'initialisation du constructeur, qui est l'endroit où vous pouvez et devez appeler le constructeur de la classe de base et où vous devez également initialiser les membres de données. La liste d'initialisation vient après la signature du constructeur après un deux-points, et avant le corps du constructeur. Disons que nous avons une classe A :
class A : public B
{
public:
A(int a, int b, int c);
private:
int b_, c_;
};
Ensuite, en supposant que B a un constructeur qui prend un int, le constructeur de A peut ressembler à ceci :
A::A(int a, int b, int c)
: B(a), b_(b), c_(c) // initialization list
{
// do something
}
Comme vous pouvez le voir, le constructeur de la classe de base est appelé dans la liste d'initialisation. L'initialisation des membres de données dans la liste d'initialisation est d'ailleurs préférable à l'affectation des valeurs de b_ et c_ dans le corps du constructeur, car vous économisez le coût supplémentaire de l'affectation.
Gardez à l'esprit que les membres des données sont toujours initialisés dans l'ordre dans lequel ils sont déclarés dans la définition de la classe, indépendamment de leur ordre dans la liste d'initialisation. Pour éviter des bogues étranges, qui peuvent survenir si vos membres de données dépendent les uns des autres, vous devez toujours vous assurer que l'ordre des membres est le même dans la liste d'initialisation et dans la définition de la classe. Pour la même raison, le constructeur de la classe de base doit être le premier élément de la liste d'initialisation. Si vous l'omettez complètement, le constructeur par défaut de la classe de base sera appelé automatiquement. Dans ce cas, si la classe de base n'a pas de constructeur par défaut, vous obtiendrez une erreur de compilation.
21 votes
Je ne fais que pinailler : Il n'y a pas de "super classe" en C++, en fait, la norme n'en parle pas du tout. Cette formulation provient de Java (très probablement). Utilisez "classe de base" en C++. Je suppose que super implique un seul parent, alors que le C++ permet un héritage multiple.
0 votes
@andreee je red que un
super class
est également appelébase class
et aussi par exemple dans la boîte à outils qtparent class
- dans cet ordre unsub class
est également appeléchild class
Peut-être que cela aide à combattre une certaine confusion potentielle dans la terminologie.