Maison > Article > développement back-end > Les initialiseurs désignés peuvent-ils être utilisés pour initialiser les membres hérités dans les agrégats C 20 ?
Initialiseurs et agrégats désignés en C 20
En C 20, les initialiseurs désignés fournissent un moyen concis d'initialiser les types d'agrégats en spécifiant explicitement le membre à initialiser. Cependant, cette syntaxe présente des limites lorsqu'il s'agit d'initialiser des classes héritées.
Considérez l'extrait de code suivant :
<code class="cpp">struct Person { std::string name; std::string surname; unsigned age; }; struct Employee : Person { unsigned salary; };</code>
Personne et Employee sont des agrégats, mais la tentative suivante d'initialisation de Employee à l'aide de les initialiseurs désignés échouent :
<code class="cpp">Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}};</code>
Cela est dû au fait que la norme C spécifie que les initialiseurs désignés ne peuvent être utilisés que pour initialiser les données membres directes non statiques d'une classe. Dans l'exemple ci-dessus, le salaire est un membre de la classe dérivée Employé, et non de la classe de base directe Personne, donc l'initialisation désignée n'est pas autorisée.
Au lieu de cela, vous devez utiliser l'initialisation de liste traditionnelle pour initialiser les membres hérités :
<code class="cpp">Employee e1{ "John", "Wick", 40, 50000 };</code>
Ou, comme l'a souligné un commentaire, vous pouvez utiliser une liste d'initialiseurs désignée imbriquée pour initialiser la classe de base :
<code class="cpp">Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, 50000 };</code>
Dans ce cas, la classe de base directe est initialisée en utilisant une liste d'initialisation désignée, tandis que la classe Employee dans son ensemble est initialisée à l'aide d'une liste d'initialisation régulière.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!