gemäß Norm 12.6.3/p1 Initialisierung durch vererbte Konstruktor [class.inhctor.init] (Emphasis-Mine):
Wenn ein Konstruktor für Typ B
aufgerufen wird, um ein Objekt eines anderen Typs D
zu initialisieren (dh, wenn der Konstruktor geerbt wurde (7.3.3)), wird die Initialisierung so fortgesetzt, als ob ein Standardstandard constr Uctor wurde verwendet, um das -Objekt und jede Basisklasse -Unterobjekt zu initialisieren, von dem der Konstruktor geerbt wurde, außer dass das B
-Unterobjekt durch den Aufruf des geerbten -Konstruktors initialisiert wird. Die vollständige Initialisierung wird als einzelner Funktionsaufruf betrachtet; insbesondere wird die Initialisierung der ererbten Konstruktorparameter vor der Initialisierung eines beliebigen Teils des Objekts sequenziert.
Daher werden Konstruktoren nicht tatsächlich vererbt, sondern sie werden implizit oder explizit vom jeweiligen abgeleiteten Konstruktor aufgerufen. Beachten Sie auch, dass die geerbten Konstruktoren einfach die Basiskonstruktoren aufrufen und keine Elementinitialisierung im abgeleiteten Objekt ausführen.
Um dies zu verdeutlichen folgendes Beispiel:
struct Base {
Base(int);
...
};
struct Derived : Base {
using Base::Base;
...
};
Die obige Derived
Klassendefinition ist syntaktisch äquivalent mit:
struct Derived : Base {
Derived(int i) : Base(i) {}
...
};
Das heißt, die using
Deklaration in der Derived
Klasse definiert implizit den Konstruktor Derived(int)
. Beachten Sie an dieser Stelle auch, dass das Programm schlecht formatiert ist, wenn der Konstruktor von mehreren abgeleiteten Basisklassen-Unterobjekten geerbt wird.
Auf die gleiche Art und Weise Sie zu dem logischen Schluss führen worden bin, da ich habe eine Kopie Konstruktor mit der using-Deklaration in der Basisklasse deklariert:
class TBase {
public:
TBase();
TBase(const TBase &);
};
class TDerived: public TBase {
public:
using TBase::TBase;
};
Ich würde das folgende syntaktische Äquivalent erhalten Derived
Klasse:
class TDerived: public TBase {
public:
TDerived() : Base() {}
TDerived(TBase const &other) : Base(other) {}
};
Dies ist jedoch nicht der Fall. Sie können einen Kopierkonstruktor weder als Standardkonstruktor noch als Bewegungskonstruktor "erben". Warum? Denn so schreibt der C++ - Standard dies vor.
Was können Sie stattdessen zu tun ist, einen benutzerdefinierten Konstruktor zu definieren, die als Eingabe eine Basisklasse Objekt nehmen:
class TDerived: public TBase {
public:
TDerived(TBase const &other) {}
};
Nachdem alle TDerived
und TBase
sind verschiedene Klassen, obwohl die erste, die zweite erbt.
Weil spezielle Member-Funktionen nicht vererbt werden? Das würde keinen Sinn ergeben. Womit du enden würdest, wäre kein "Copy Constructor". –