web-dev-qa-db-fra.com

Qu'est-ce que l'héritage constructeur?

En C++ 11, que signifie l'héritage du constructeur? Si c'est ce que je pense que c'est (le constructeur de la classe de base est introduit dans la portée de la classe dérivée), quelles sont ses implications sur mon code? Quelles sont les applications d'une telle fonctionnalité?

65
badmaash

Hériter de constructeurs signifie exactement cela. Une classe dérivée peut hériter implicitement des constructeurs de ses classes de base.

La syntaxe est la suivante:

struct B
{
    B(int); // normal constructor 1
    B(string); // normal constructor 2
};

struct D : B
{
    using B::B; // inherit constructors from B
};

Alors maintenant, D a les constructeurs suivants définis implicitement:

D::D(int); // inherited
D::D(string); // inherited

Les membres Ds sont construits par défaut par ces constructeurs hérités.

C'est comme si les constructeurs étaient définis comme suit:

D::D(int x) : B(x) {}
D::D(string s) : B(s) {}

La fonctionnalité n'a rien de spécial. C'est juste un raccourci pour enregistrer le code passe-partout.

Voici les détails sanglants:

12.9 Hériter de constructeurs

1) Une déclaration d'utilisation qui nomme un constructeur déclare implicitement un ensemble de constructeurs héritiers. L'ensemble candidat de constructeurs hérités de la classe X nommé dans la déclaration using se compose de constructeurs réels et de constructeurs théoriques qui résultent de la transformation des paramètres par défaut comme suit:

  • tous les constructeurs non modèles de X, et
  • pour chaque constructeur non modèle de X qui a au moins un paramètre avec un argument par défaut, l'ensemble de constructeurs résultant de l'omission de toute spécification de paramètre Ellipsis et de l'omission successive de paramètres avec un argument par défaut à la fin de la liste des types de paramètres, et
  • tous les modèles de constructeur de X, et
  • pour chaque modèle de constructeur de X qui a au moins un paramètre avec un argument par défaut, l'ensemble de modèles de constructeur qui résulte de l'omission de toute spécification de paramètre Ellipsis et de l'omission successive de paramètres avec un argument par défaut à la fin de la liste des types de paramètres
84
Andrew Tomazos