Aus Basisklasse, abgeleitete Methode aufrufen



  • Hallo,

    Ich bin gerade arg verwirrt warum folgender Code nicht funktioniert:

    class base
    {
    public:
      virtual anyBaseObject* createObj() { return standardBaseObject(); }
      base() { createObj(); }
    };
    
    class derived : public base
    {
    public:
      virtual anyBaseObject* createObj() { return derivedBaseObject(); }
      derived() : base() { }
    };
    
    derived test; //derived::createObj never gets called
    

    Sollte nicht im konstruktor der base Klasse die createObj Funktion von derived aufgerufen werden?

    Wenn nicht, wie ist sowas elegant möglich?
    Besten Dank für Hilfe,
    Timo



  • Timo.Stark schrieb:

    Sollte nicht im konstruktor der base Klasse die createObj Funktion von derived aufgerufen werden?

    Nein. Das ist Absicht. Zu diesem Zeitpunkt wurde der derived-Teil des Objekts noch gar nicht initialisiert. Du findest im Netz bestimmt gute Eklärungen dazu, wenn Du nach den Stichwörtern C++, constructor, virtual function suchst.



  • Sollte nicht im konstruktor der base Klasse die createObj Funktion von derived aufgerufen werden?

    Nein. Im konstruktor der base klasse wird natürlich die version der baseklasse verwendet....
    Welche funktion hätte denn sonnst das ableiten und das implemetieren der Funktion in der base Klasse?
    Wenn man dann doch überall die selbe Funktion aufruft.
    Wenn Du möchtest das für beide die gleiche createObj funktion benutzt wird dann implementiere Sie in der Base und überschreibe sie nicht!

    muli



  • Danke, ich nehme dann den Umweg über eine Initalisierungs Funktion

    class base 
    { 
    public: 
      virtual anyBaseObject* createObj() { return standardBaseObject(); } 
      base() {  }
      bool init() { createObj(); return true; } 
    }; 
    
    class derived : public base 
    { 
    public: 
      virtual anyBaseObject* createObj() { return derivedBaseObject(); } 
      derived() : base() { init(); } 
    };
    

    derived test; //derived::createObj never gets called



  • Dein Ansatz sieht schon irgendwie komisch aus.
    Vielleicht gibt's noch eine bessere Lösung.
    ZB kannst Du hier

    derived() : base(...parameter...) { ... }
    

    dem base-Konstruktor noch Parameter übergeben. Und sonst gab's da auch nen Trick mit virtual inheritance, aber darauf würde ich, soweit es geht, verzichten.


Anmelden zum Antworten