Heim >Backend-Entwicklung >C++ >Warum erben abgeleitete Klassen in C keine Konstruktoren und wie können wir das Problem beheben?

Warum erben abgeleitete Klassen in C keine Konstruktoren und wie können wir das Problem beheben?

DDD
DDDOriginal
2025-01-05 08:52:40726Durchsuche

Why Don't Derived Classes Inherit Constructors in C   and How Can We Fix It?

Konstruktoren erben: Eine Geschichte der Vererbung

Im bereitgestellten Codeausschnitt beobachten wir einen Fehler beim Versuch, ein Objekt der Klasse B mit B *b = new zu initialisieren B(5); trotz des Vorhandenseins eines Konstruktors in der Basisklasse A. Dies wirft die Frage auf, warum in dieser nicht auf geerbte Konstruktoren zugegriffen werden kann Fall.

Der Schlüssel zum Verständnis dieses Problems liegt in den komplizierten Regeln der Konstruktorvererbung in C . Da es keine explizite Konstruktorvererbung gibt, erben abgeleitete Klassen nicht automatisch Konstruktoren von ihren Basisklassen. Dies war im C 03-Standard der Fall. Um eine Konstruktorvererbung zu erreichen, muss die abgeleitete Klasse explizit das Schlüsselwort using verwenden, wie im folgenden korrigierten Code zu sehen ist:

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

class B: public A {
     using A::A;
};

Mit dem Zusatz von using A::A; erbt Klasse B nun den Konstruktor von Klasse A, Behebung des Fehlers. Es ist wichtig zu beachten, dass diese Vererbung für alle Konstruktoren in der Basisklasse gilt und die abgeleitete Klasse nicht selektiv nur bestimmte Konstruktoren erben kann.

Wenn Ihr Compiler den C 11-Standard unterstützt, können Sie das Schlüsselwort using für den Konstruktor verwenden Nachlass. Im C 03-Standard wurden Konstruktoren jedoch nicht standardmäßig geerbt und mussten manuell in der abgeleiteten Klasse implementiert werden, indem der Basiskonstruktor aufgerufen wurde.

Für Basisklassen mit Vorlagen kann auch das Schlüsselwort using verwendet werden erben Sie Konstruktoren, wie in diesem Beispiel gezeigt:

template<class T>
class my_vector : public vector<T> {
    public:
    using vector<T>::vector; ///Takes all vector's constructors
    /* */
};

Das obige ist der detaillierte Inhalt vonWarum erben abgeleitete Klassen in C keine Konstruktoren und wie können wir das Problem beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn