Comment exploiter les constructeurs et l'opérateur d'affectation de la classe de base en C
En C, les classes héritantes peuvent hériter du comportement de la classe de base, y compris constructeurs et opérateurs d’affectation. Considérons une classe de base B avec un ensemble de constructeurs et un opérateur d'affectation :
<code class="cpp">class B { public: B(); B(const string& s); B(const B& b) { *this = b; } B& operator=(const B& b); };</code>
Maintenant, vous souhaitez créer une classe dérivée D qui remplace la fonction foo() tout en héritant du même ensemble de constructeurs, y compris le constructeur de copie et l'opérateur d'affectation. Cependant, pour éviter la duplication, vous souhaitez utiliser les constructeurs et opérateurs existants dans B.
Invocation explicite :
Vous pouvez appeler explicitement les constructeurs et l'opérateur d'affectation de la classe de base. dans le constructeur et l'opérateur d'affectation de la classe dérivée, respectivement. Cela garantit que les variables membres de la classe de base sont correctement initialisées.
<code class="cpp">class D : public B { public: D(const D& d) : B(d), additional_(d.additional_) {} D& operator=(const D& d) { B::operator=(d); additional_ = d.additional_; return *this; } private: int additional_; };</code>
Invocation implicite :
Fait intéressant, même si vous ne définissez pas explicitement le constructeur de copie et opérateur d'affectation dans la classe dérivée, le compilateur générera des versions par défaut. Ces versions par défaut appellent implicitement le constructeur de copie et l'opérateur d'affectation de la classe de base, respectivement.
Par exemple, avec la classe de base suivante :
<code class="cpp">class ImplicitBase { int value_; };</code>
L'opérateur d'affectation de la classe dérivée suivante appelle implicitement la classe de base opérateur d'affectation de la classe :
<code class="cpp">class Derived : public ImplicitBase { const char* name_; public: Derived& operator=(const Derived& d) { ImplicitBase::operator=(d); // Implicit call to base class's assignment operator name_ = strdup(d.name_); return *this; } };</code>
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!