Maison  >  Article  >  développement back-end  >  Les membres parents protégés peuvent-ils être initialisés à l'aide de la liste d'initialisation de l'enfant ?

Les membres parents protégés peuvent-ils être initialisés à l'aide de la liste d'initialisation de l'enfant ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-24 19:15:02634parcourir

Can Protected Parent Members be Initialized Using Child's Initialization List?

Initialisation des membres parents protégés avec la liste d'initialisation de l'enfant

En programmation orientée objet, vous devrez peut-être initialiser les membres protégés déclarés dans une classe parent du constructeur d’une classe enfant. Il s'agit d'un scénario courant, mais la question se pose : cela peut-il être réalisé en utilisant la liste d'initialisation de la classe enfant ?

Considérons l'exemple suivant :

<code class="cpp">class Parent {
protected:
    std::string something;
};

class Child : public Parent {
private:
    Child() : something("Hello, World!") {}
};</code>

Lorsque vous essayez de compiler ce code, le compilateur signale une erreur : "la classe 'Enfant' n'a aucun champ nommé 'quelque chose'". Cette erreur indique que le compilateur ne peut pas localiser le membre quelque chose dans la classe Enfant.

Le problème ici réside dans l'incapacité pour la liste d'initialisation de la classe enfant (:quelque chose("Hello, World!")) d'accéder à l'objet protégé. membres de la classe parent. En effet, la liste d'initialisation initialise elle-même les membres privés de la classe enfant et les membres protégés de la classe parent ne sont pas accessibles depuis la section privée de la classe enfant.

Solution : constructeur de transfert

Pour surmonter ce problème, vous pouvez utiliser un constructeur de transfert dans la classe parent pour transmettre les valeurs d'initialisation au membre protégé :

<code class="cpp">class Parent {
protected:
    Parent(const std::string& something) : something(something) {}
    std::string something;
};

class Child : public Parent {
private:
    Child() : Parent("Hello, World!") {}
};</code>

Avec cette approche, le constructeur de la classe Child appelle le Constructeur de la classe parent via la syntaxe Parent("Hello, World!"). Cette initialisation transmet le paramètre quelque chose au constructeur de la classe parent, qui initialise ensuite le membre quelque chose protégé.

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