Wird der Konstruktor vererbt?

... komplette Frage anzeigen

5 Antworten

Ganz so einfach ist diese Frage gar nicht zu beantworten; zunächst einmal muss ich aber etwas weiter ausholen:

  • Prinzipiell benötigt jede Klasse (sowohl in C++ als auch in Java) einen Konstruktor.
  • Wenn kein Konstruktor in einer Klasse existiert, wird ein Konstruktor ohne Argumente vom Compiler hinzugefügt
  • Dieser muss einen Konstruktor der Basisklasse aufrufen (was bei C++ allerdings deutlich komplizierter gemacht wird als bei Java).
  • Wenn ein Konstruktor keinen Konstruktor der Basisklasse aufruft, fügt der Compiler automatisch den Aufruf des Standardkonstruktors hinzu

Wenn du in einer Klasse also gar keinen Konstruktor hast, wird also ein Konstruktor erzeugt, der sich so verhält, als wäre der Standardkonstruktor vererbt worden.

Ich habe spaßeshalber mit GCC und eingeschalteter Optimierung eine entsprechende C++-Datei compiliert und mir den Assembler-Code angeschaut:

In diesem Fall wird kein solcher Konstruktor erstellt, sondern GCC vererbt einfach den Konstruktor, so, wie eine normale Methode vererbt wird.

Ich habe bei GCC verschiedene Einstellungen verwendet: Der Destruktor wurde dabei immer vererbt, so, wie eine normale Methode vererbt wird. Woher du Information hast, dass Destruktoren sich nicht vererben, weiß ich nicht.

Allerdings muss ein Destruktor - wie beim Konstruktor - immer den Destruktor der Basisklasse aufrufen. Dieser Aufruf wird bei C++ immer nur automatisch vom Compiler hinzugefügt, so dass man ihn im Code nicht sehen kann.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von ralphdieter
28.01.2016, 11:18

GCC vererbt einfach den Konstruktor, so, wie eine normale Methode vererbt wird.

Das klappt aber nur, wenn die abgeleitete Klasse keine neuen Objekte definiert.

0

In C++ werden Konstruktoren nicht vererbt. Was bringt Dich auf den Gedanken, dass es anders sein könnte? Und warum hast Du "Java" als Thema angegeben, aber nicht "C-plus-plus"?

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von schnah
27.01.2016, 13:47

Weil in einer Beispielaufgabe von mir , hat die geerbte Klasse auf einen Konstruktor der Basisklasse zugegriffen, wie kann das sein? Indemdie erbende Klasse, eins seiner  Attribute in die Parameterliste eines Konstruktors , der Basisklasse "gefüllt" hat.

0
Kommentar von RakonDark
27.01.2016, 13:50

Also die Frage sagte eine vererbung "an die Basisklasse" . An die Basis wird nie was vererbt .

0

Ich kann C++ nicht, aber im Normalfall wird der Standartkonstruktor vererbt! Überladungen natürlich nicht, die musst du selbst aufrufen :) Ich dachte ich schreib das mal, hat ja sonst noch niemand geantwortet.

Antwort bewerten Vielen Dank für Deine Bewertung

Seit C++11 kannst du "using" benutzen:

class Derived : public Base {
using Base::Base;
}
Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?