Maison >développement back-end >C++ >Quand la liste d'initialisation d'un constructeur de classe enfant peut-elle être utilisée pour initialiser des données membres protégées ?

Quand la liste d'initialisation d'un constructeur de classe enfant peut-elle être utilisée pour initialiser des données membres protégées ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-24 13:59:02733parcourir

When Can the Initialization List of a Child Class Constructor Be Used to Initialize Protected Data Members?

Liste d'initialisation et initialisation des membres protégés

Dans la programmation orientée objet utilisant C , il est courant que les classes héritent des classes parents et étendre leurs fonctionnalités. Cependant, une question se pose : la liste d'initialisation du constructeur d'une classe enfant peut-elle être utilisée pour initialiser des données membres déclarées comme protégées dans la classe parent ?

Pour tenter d'y parvenir, on peut avoir du code similaire au suivant :

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

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

Cependant, cette tentative entraînera une erreur du compilateur, indiquant que la classe Child n'a pas de champ nommé quelque chose. En effet, le membre de données quelque chose est déclaré comme protégé dans la classe parent.

Pour initialiser les membres protégés à l'aide de la liste d'initialisation d'une classe enfant, une approche alternative est requise. Un constructeur avec l'initialisation requise peut être ajouté à la classe parent, et ce constructeur peut ensuite être invoqué à partir du constructeur de la classe enfant. Ceci peut être réalisé grâce au transfert de constructeur :

<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>

Dans ce code modifié, un constructeur protégé est ajouté à la classe Parent et il prend un paramètre de chaîne. Le constructeur de la classe Enfant appelle ensuite le constructeur protégé de la classe Parent en utilisant le transfert de constructeur pour transmettre l'argument nécessaire et initialiser le membre de données quelque chose.

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