Maison >développement back-end >C++ >Pourquoi les constructeurs hérités en C nécessitent-ils une définition explicite avant C 11 ?

Pourquoi les constructeurs hérités en C nécessitent-ils une définition explicite avant C 11 ?

DDD
DDDoriginal
2025-01-03 12:49:39306parcourir

Why Do Inherited Constructors in C   Require Explicit Definition Before C  11?

Hériter des constructeurs : comprendre les règles d'erreur et d'héritage

Lorsque vous tentez d'hériter d'un constructeur d'une classe de base sans le redéfinir explicitement dans le dérivé classe, comme illustré dans l'extrait de code fourni, pourquoi cela entraîne-t-il une erreur de compilation ?

En C , avant C 11, les constructeurs n'étaient pas hérités par les classes dérivées. Pour exécuter le constructeur de la classe de base, il devait être explicitement appelé dans le constructeur de la classe dérivée. C'est pourquoi le message d'erreur suivant s'affiche dans le code donné :

main.cpp:13: error: no matching function for call to ‘B::B(int)’
main.cpp:8: note: candidates are: B::B()
main.cpp:8: note:                 B::B(const B&)

Pour hériter des constructeurs en C 11 et versions ultérieures, le mot-clé using est introduit. Ce mot-clé peut être utilisé pour hériter collectivement de tous les constructeurs de la classe de base.

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

class B: public A
{
    using A::A; // Inherits all constructors of A
};

Cette approche vous permet d'hériter de tous les constructeurs de la classe de base dans une seule ligne de code. Cependant, il est important de noter que l'héritage sélectif de certains constructeurs n'est pas possible avec cette méthode. Pour obtenir un héritage sélectif, vous devez écrire manuellement des constructeurs individuels dans la classe dérivée, en appelant le constructeur de la classe de base si nécessaire.

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