Maison >développement back-end >C++ >Pourquoi ne puis-je pas initialiser les membres d'une classe dérivée à l'aide d'initialiseurs désignés dans C 20 ?

Pourquoi ne puis-je pas initialiser les membres d'une classe dérivée à l'aide d'initialiseurs désignés dans C 20 ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-29 14:44:02447parcourir

Why Can't I Initialize Derived Class Members Using Designated Initializers in C  20?

Initialiseurs désignés en C 20 : initialisation des classes dérivées

Les initialiseurs désignés, introduits en C 20, permettent une initialisation précise des membres de la classe à l'aide une liste d'initialiseurs désignés. Cependant, une question récente met en lumière un comportement inattendu avec les classes dérivées.

Question :

Le code suivant illustre le problème :

<code class="cpp">struct Person {
    std::string name{};
    std::string surname{};
    unsigned age{};
};

struct Employee : Person {
    unsigned salary{10000};
};

int main() {
    Person p{.name{"John"}, .surname{"Wick"}, .age{40}}; // Ok
    Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}}; // Doesn't compile
    Employee e2{.salary{55000}}; // Warning: missing initializer for base class
}</code>

Pourquoi l'initialisation de l'employé avec les initialiseurs désignés échoue-t-elle et produit-elle un avertissement pour l'initialiseur manquant ?

Réponse :

Selon la norme C 20 (9.3.1 Agrégats, p. #3), lors de l'utilisation d'initialiseurs désignés, chaque identifiant dans le désignateur doit nommer une donnée membre directe non statique de la classe. Cela implique que les membres de la classe de base ne peuvent pas être initialisés à l'aide d'initialiseurs désignés.

Par conséquent, initialiser Employee à l'aide d'initialiseurs désignés, comme dans le cas de e1, est incorrect et doit être remplacé par une initialisation de liste ou une initialisation imbriquée comme suit :

<code class="cpp">Employee e1{"John", "Wick", 40, 50000}; // List initialization
Employee e2{{"John", "Wick", 40}, 50000}; // Nested initialization
Employee e1{{.name{"John"}, .surname{"Wick"}, .age{40}}, 50000}; // Nested initialization with designated initializer for base class</code>

Dans le dernier exemple, la classe de base Person est initialisée à l'aide d'une liste d'initialiseurs désignée dans l'initialisation imbriquée.

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!

Déclaration:
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