Maison > développement back-end > C++ > Pourquoi les classes dérivées n'héritent-elles pas des constructeurs en C et comment pouvons-nous y remédier ?

Pourquoi les classes dérivées n'héritent-elles pas des constructeurs en C et comment pouvons-nous y remédier ?

DDD
Libérer: 2025-01-05 08:52:40
original
717 Les gens l'ont consulté

Why Don't Derived Classes Inherit Constructors in C   and How Can We Fix It?

Héritage des constructeurs : une histoire d'héritage

Dans l'extrait de code fourni, nous observons une erreur lors de la tentative d'initialisation d'un objet de classe B avec B *b = new B(5);, malgré la présence d'un constructeur dans la classe de base A. Cela soulève la question de savoir pourquoi les constructeurs hérités ne sont pas accessibles dans cette classe de base. cas.

La clé pour comprendre ce problème réside dans les règles complexes de l'héritage des constructeurs en C . En l’absence d’héritage explicite des constructeurs, les classes dérivées n’héritent pas automatiquement des constructeurs de leurs classes de base. C'était le cas de la norme C 03. Pour obtenir l'héritage du constructeur, la classe dérivée doit utiliser explicitement le mot-clé using, comme le montre le code corrigé suivant :

class A {
    public:
        explicit A(int x) {}
};

class B: public A {
     using A::A;
};
Copier après la connexion

Avec l'ajout de using A::A;, la classe B hérite désormais du constructeur de classe A, résolvant l’erreur. Il est important de noter que cet héritage s'applique à tous les constructeurs de la classe de base et que la classe dérivée ne peut pas hériter sélectivement uniquement de certains constructeurs.

Si votre compilateur prend en charge la norme C 11, vous pouvez utiliser le mot clé using pour le constructeur. héritage. Cependant, dans la norme C 03, les constructeurs n'étaient pas hérités par défaut et devaient être implémentés manuellement dans la classe dérivée en appelant le constructeur de base.

Pour les classes de base basées sur un modèle, le mot-clé using peut également être utilisé pour hériter des constructeurs comme démontré dans cet exemple :

template<class T>
class my_vector : public vector<T> {
    public:
    using vector<T>::vector; ///Takes all vector's constructors
    /* */
};
Copier après la connexion

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal