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) {}
};
classe B : public A
{
};
int main(void)
{
B *b = new B(5); delete b;
}
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&)
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
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
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!