Konstruktoren vererben: Ein Rätsel
Wenn Konstruktoren nicht wie erwartet vererbt werden, kann das rätselhaft sein. Betrachten Sie den folgenden Codeausschnitt:
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) {}
};
class B: public A
{
};
int main(void)
{
B *b = new B(5); delete b;
}
Dieser Code generiert Kompilierungsfehler:
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&)
Unerwartet, Klasse B erbt den Konstruktor nicht von Klasse A.
Enthüllung der Lösung
In C 03 wurden Konstruktoren nicht automatisch geerbt. Um einen Konstruktor zu erben, musste er manuell vom Konstruktor der abgeleiteten Klasse aufgerufen werden. Mit der Konstruktorvererbung von C 11 wurde diese Einschränkung jedoch gemildert.
Nutzung der Konstruktorvererbung
Mit C 11 ermöglicht die Verwendung des Schlüsselworts using die Vererbung aller Konstruktoren aus der Basisklasse. Fügen Sie dazu einfach die folgende Zeile zur abgeleiteten Klasse hinzu:
using A::A; // Inherits all constructors from class A
Durch die Verwendung dieser Technik werden alle Konstruktoren aus der Basisklasse in die abgeleitete Klasse vererbt.
Ausnahmebehandlung
Es ist wichtig zu beachten, dass eine abgeleitete Klasse, die manuell einen Konstruktor definiert, keine Konstruktoren von der Basis erbt Klasse. In solchen Fällen müssen alle Konstruktoren manuell definiert werden und den Basisklassenkonstruktor bei Bedarf explizit aufrufen.
Basisklassen mit Vorlagen
Für Basisklassen mit Vorlagen gilt ein ähnlicher Ansatz beschäftigt. Um alle Konstruktoren von einer Basisklasse mit Vorlagen in eine abgeleitete Klasse zu erben, verwenden Sie die folgende Syntax:
using vector<T>::vector; /// Takes all vector's constructors
Dieser Ansatz stellt sicher, dass alle Konstruktoren von der Basisklasse in die abgeleitete Klasse vererbt werden.
Das obige ist der detaillierte Inhalt vonWarum erbt meine abgeleitete Klasse nicht den Konstruktor meiner Basisklasse in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!