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


  • Mod

    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 B instanziert, wird erst der Konstruktor von A aufgerufen und dann der von B . Wenn nun im CTor von A ein Funktionsaufruf einer Funktion die sich auf den Konstruktor von B verlä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.


Anmelden zum Antworten