In C++ gibt es das Konzept der Initialisierungsliste des Konstruktors, in der Sie den Konstruktor der Basisklasse aufrufen können und sollten und in der Sie auch die Datenelemente initialisieren sollten. Die Initialisierungsliste steht nach der Konstruktorsignatur, gefolgt von einem Doppelpunkt, und vor dem Körper des Konstruktors. Nehmen wir an, wir haben eine Klasse A:
class A : public B
{
public:
A(int a, int b, int c);
private:
int b_, c_;
};
Unter der Annahme, dass B einen Konstruktor hat, der einen int annimmt, kann der Konstruktor von A wie folgt aussehen:
A::A(int a, int b, int c)
: B(a), b_(b), c_(c) // initialization list
{
// do something
}
Wie Sie sehen können, wird der Konstruktor der Basisklasse in der Initialisierungsliste aufgerufen. Die Initialisierung der Datenelemente in der Initialisierungsliste ist übrigens besser als die Zuweisung der Werte für b_ und c_ innerhalb des Konstruktorkörpers, da Sie die zusätzlichen Kosten der Zuweisung sparen.
Beachten Sie, dass Datenelemente immer in der Reihenfolge initialisiert werden, in der sie in der Klassendefinition deklariert sind, unabhängig von ihrer Reihenfolge in der Initialisierungsliste. Um seltsame Fehler zu vermeiden, die entstehen können, wenn Ihre Datenmitglieder voneinander abhängen, sollten Sie immer sicherstellen, dass die Reihenfolge der Mitglieder in der Initialisierungsliste und in der Klassendefinition gleich ist. Aus demselben Grund muss der Konstruktor der Basisklasse der erste Punkt in der Initialisierungsliste sein. Wenn Sie ihn ganz weglassen, wird automatisch der Standardkonstruktor der Basisklasse aufgerufen. Wenn die Basisklasse in diesem Fall keinen Standardkonstruktor hat, erhalten Sie einen Compilerfehler.
21 Stimmen
Nur eine Erbsenzählerei: In C++ gibt es keine "Superklasse", in der Norm wird sie überhaupt nicht erwähnt. Diese Formulierung stammt (höchstwahrscheinlich) aus Java. In C++ wird "Basisklasse" verwendet. Ich denke, dass super impliziert einen einzigen Elternteil, während C++ Mehrfachvererbung zulässt.
0 Stimmen
@andreee Ich redete, dass ein
super class
wird auch alsbase class
und auch z.B. im qt toolkitparent class
- in dieser Reihenfolge asub class
wird auch alschild class
Vielleicht hilft das, eine mögliche Verwirrung in der Terminologie zu bekämpfen