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!