Maison > développement back-end > C++ > Pourquoi ma classe dérivée n'hérite-t-elle pas du constructeur de ma classe de base en C ?

Pourquoi ma classe dérivée n'hérite-t-elle pas du constructeur de ma classe de base en C ?

Barbara Streisand
Libérer: 2024-12-21 07:35:10
original
518 Les gens l'ont consulté

Why Doesn't My Derived Class Inherit My Base Class's Constructor in C  ?

Héritage des constructeurs : une énigme

Lorsque les constructeurs ne sont pas hérités comme prévu, cela peut être déroutant. Considérez l'extrait de code suivant :

class A<br>{</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">public: 
    explicit A(int x) {}
Copier après la connexion

};

classe B : public A
{
};

int main(void)
{

B *b = new B(5);
delete b;
Copier après la connexion

}

Ce code génère des erreurs de compilation :

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&)
Copier après la connexion

De façon inattendue, la classe B n'hérite pas du constructeur de la classe A.

Dévoilement du Solution

En C 03, les constructeurs n'étaient pas hérités automatiquement. Pour hériter d'un constructeur, il fallait l'appeler manuellement à partir du constructeur de la classe dérivée. Cependant, avec l'héritage des constructeurs de C 11, cette limitation a été atténuée.

Exploiter l'héritage des constructeurs

Avec C 11, l'utilisation du mot-clé using permet l'héritage de tous les constructeurs de la classe de base. Pour ce faire, ajoutez simplement la ligne suivante à la classe dérivée :

using A::A; // Inherits all constructors from class A
Copier après la connexion

En utilisant cette technique, tous les constructeurs de la classe de base sont hérités dans la classe dérivée.

Gestion des exceptions

Il est important de noter que si une classe dérivée définit manuellement un constructeur, elle n'héritera d'aucun constructeur de la classe de base. Dans de tels cas, tous les constructeurs doivent être définis manuellement et appeler explicitement le constructeur de la classe de base si nécessaire.

Classes de base basées sur des modèles

Pour les classes de base basées sur des modèles, une approche similaire est employé. Pour hériter de tous les constructeurs d'une classe de base basée sur un modèle vers une classe dérivée, utilisez la syntaxe suivante :

using vector<T>::vector; /// Takes all vector's constructors
Copier après la connexion

Cette approche garantit que tous les constructeurs de la classe de base sont hérités dans la classe dérivée.

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