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
DDDoriginal
2025-01-05 08:52:40726parcourir

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

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
    /* */
};

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