Maison > développement back-end > C++ > Les initialiseurs désignés peuvent-ils être utilisés pour initialiser les membres hérités dans les agrégats C 20 ?

Les initialiseurs désignés peuvent-ils être utilisés pour initialiser les membres hérités dans les agrégats C 20 ?

Patricia Arquette
Libérer: 2024-10-29 02:44:02
original
463 Les gens l'ont consulté

Can Designated Initializers be Used to Initialize Inherited Members in C  20 Aggregates?

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal