Virtuelle Methoden und Konstruktoren



  • Hi, ich habe eine ähnliche Situation, wie hier dargestellt:

    class A
    {
    protected:
        virtual void Method() { cout << "A::Method"; };
    public:
        A(const A& source) { Method(); };
    }
    
    class B : public A
    {
    protected:
        virtual void Method() { cout << "B::Method"; };
    public:
        B(const B& source) : A(source) {};
    }
    

    Bei mir wird im Konstruktor leider nicht B::Method() aufgerufen, sondern die von A. Ich hoffe, dass das Minibeispiel korrekt ist. Bei meinen richtigen Klassen ist das zumindest so.

    Ist das wirklich so, wie es aussieht, dass im Konstruktor von A wirklich nur Methoden von A benutzt werden, obwohl sie virtual überschrieben sind?? Ich fände es sehr schade, wenn die Polymorphie tatsächlich erst NACH der Konstruktion in Gang kommt. Das wäre ja eine Verletzung gegen objektorientierte Paradigmen -- meiner Meinung nach :). Denn ich habe nun das Problem, dass mein B nicht korrekt initialisiert wird. Teile, die in B::Method() ausgeführt werden, fehlen.

    Gibt's da ne nette Lösung??

    Viele Grüße und ebensoviel Dank,
    Felix



  • Wenn der Ctor von A ausgeführt wird, dann existiert B ja noch garnicht. Du kannst also keine virtuellen Funktionen in einem Ctor verwenden...



  • Ja, das habe ich mir schon fast gedacht. Aber das halte ich für eine Verletzung der Polymorphie. Ich muss ja jetzt extra irgendwas coden, damit alles vernünftig läuft. Und mir v.a. an zwei Stellen darüber gedanken machen. Schade...



  • FelixManke schrieb:

    Aber das halte ich für eine Verletzung der Polymorphie.

    ach was 😉

    FelixManke schrieb:

    Ich muss ja jetzt extra irgendwas coden, damit alles vernünftig läuft.

    evtl. helfen dir initialiser list weiter oder du musst halt dein Design überdenken.

    Was willst du überhaupt mit dem Aufruf der Funktion im Constructor erreichen. Evtl kann man dir dann weiterhelfen 🙂



  • Hab mir schon geholfen. Waren in meinem Fall nur 2-3 Zeilen Code in einer Schleife -- also nicht soo wild.

    Was ich machen möchte: Hab ne verkettete Template-Liste implementiert und von dieser Liste abgeleitet. Die Liste hat hält die Daten in Node-Objekten und erzeugt diese beim Einfügen -- ist ja logisch. Dazu gibt's ne virtual void Insert(const T& val). Im Copy-Konstruktor iteriere ich durch die Quell-Liste und rufe für jedes Element Insert() auf.

    Meine abgeleitete Liste muss in Insert() noch mehr machen und die Daten analysieren. Naja, und ich dachte halt, dass das mit der virtuellen Funktion funktioniert. Hat's aber nciht. Da ich aber die Analyse fast komplett in einer eigenen Methode habe, iteriere ich jetzt halt 2x, einmal im Konstruktor der Basisklasse zum anlegen der Nodes, und danach im Konstruktor der abgeleiteten Klasse und rufe die Analysemethode auf...


Anmelden zum Antworten