Variable Argumentliste in Konstruktor & Vererbung
-
Hi,
ich komm gleich mal zur Sache. Ich hab folgende Klasse:
class A { public: A() {} A(const char* msg, ...) { //Hier findet Verarbeitung der Parameterliste statt } };
Ist ja sehr einfach soweit. Jetzt will ich von dieser Klasse eine andere Klasse erben lassen:
class B : public A { };
Funktioniert auch noch. Wenn ich jetzt im Code aber z.B. die Klasse B benutzen will, dann kann ich nur den Standardkonstruktor benutzen und nicht den anderen mit der variablen Parameter-Liste:
B b(); //Klappt B b("test %d", 5); //Klappt nicht
Normalerweise könnte ich ja jetzt in der abgeleitete Klasse meine eigenen Konstruktoren definieren, und dann den Konstruktor von der Elternklasse in der Initialisierungsliste aufrufen, aber das geht ja denke ich nicht mit variablen Argumenten. Oder gibts da doch irgendeinen Weg?
[/cpp]
-
Überladene Konstruktoren werden nicht vererbt.
-
Stichwort Initialisierungsliste
class B : public A { B(const char* msg, ...) :A(msg,...) { } };
-
nur weil Du von der Klasse A erbst, heißt es nicht,
dass Klasse B nun auch einen solchen Konstruktor hat.
Den musst Du selber definieren und kannst dann den
entsprechenden Konstruktor der Basisklasse aufrufen.
-
Erstmal: Konstruktoren werden grundsätzlich nicht vererbt, d.h. in der abgeleiteten Klasse kannst du nur die dort angelegten Ctoren (inklusive der implizit erzeugten) nutzen. Aber du kannst z.B. der Klasse B einen (const char*,int)-Ctor geben, der den A-Ctor aufruft.
(afaik gibt es keinen weg, die unbekannten Parameter eines var_arg-Ctors an die Basisklasse weiterzugeben. Spontan fällt mir nur ein, die Arbeit des Ctors auszulagern in eine
void init(const char* msg,va_list args);
)
-
ups hab begriff parameterliste übersehen
-
Richtig. Dass man das normalerweise mit der Initialisierungsliste löst wenn Vererbung im Spiel ist, war mir auch klar. Hab ich ja auch extra noch am Ende geschrieben von wegen Initialisierungsliste.
Das mit so einer init()-Methode (oder halt in der vererbten Klasse auch immer den entsprechenden Code implementieren) zu lösen wäre natürlich möglich, aber für meine Zwecke ziemlich unbefriedigend. Aber danke trotzdem, v.a. @CStoll der offensichtlich als einziger die Problematik erkannt hat
Also ist das de facto wohl nicht in C++ möglich wenn ich das richtig sehe