Virtuelle Funktion in Basisklasse aufrufen
-
Hallo,
class A { public: virtual void Stuff() = 0; A() { Stuff(); } }; class B: public A { public: void Stuff() { do_something(); } }; int main() { A* obj = new B; return 0; }Wie erreiche ich das im A-Konstruktor B::Stuff aufgerufen wird?
Vielen Dank für eure Antworten, x4r3dn
-
Gar nicht. Verpass eben B einen passenden Konstruktor der dies tut. Oder schildere uns, was du erreichen willst und nicht das wie, dann gibt es bestimmt noch bessere Vorschläge.
-
Im Konstruktor: Gar nicht. Und normalerweise stellt es sich immer als Desingfehler heraus, wenn jemand meint das nötig zu haben.
Im Konstruktor von A hast du nur ein A-(Teil)Objekt und etwas nicht-initialisierten Speicher, in dem der Rest von B untergebracht werden könnte. Aber die Member von B werden erst nach der Basisklasse initialisiert, so daß du mit dem B-Anteil der Klasse auf keinen Fall etwas sinnvolles anfangen kannst.
PS: Für den Destruktor gilt das selbe Prinzip analog - da werden die B-Anteile bereits freigegeben, bevor der A-Anteil zerstört wird.
-
Wozu benötigst du das? Wenn man
Binstanziert, wird erst der Konstruktor vonAaufgerufen und dann der vonB. Wenn nun im CTor vonAein Funktionsaufruf einer Funktion die sich auf den Konstruktor vonBverlässt, klingt das schon nicht ganz in Ordnung, oder? Wie CStoll schon gesagt hat: Wahrscheinlich ein Designfehler
PS: Steht relativ am Anfang von "Effektiv C++":
-
SeppJ schrieb:
Gar nicht. Verpass eben B einen passenden Konstruktor der dies tut. Oder schildere uns, was du erreichen willst und nicht das wie, dann gibt es bestimmt noch bessere Vorschläge.
Natürlich kann ich den Teil auch im B-Konstruktor laufen lassen, so funktioniert mein Code im Moment auch.
Ich will damit folgendes erreichen: Ich leite mehrere Klassen von A ab, und will die Funktion nicht jedes mal erneut in deren Konstruktoren aufrufen, daher hatte ich die Idee den Code in den A-Konstruktor zu verlagern, der ja von allen abgeleiteten Klassen aufgerufen wird.
-
Wenn es eine virtuelle Funktion werden soll, hat doch sowieso jede abgeleitete Klasse ihre eigene Version davon - da ist es doch kein Problem, die nötigen Arbeiten direkt im jeweiligen Konstruktor zu erledigen.