virtuelle Funktion aus Basis-Konstruktor aufrufen



  • Guten Abend,

    weshalb wird hier "Base" und nicht "Child" ausgegeben?

    Ziel soll es sein, eine Funktion zu haben, die z.B. Member der Klasse ändert, aber nicht explizit jedes Mal im Konstruktor der Child Klasse (oder von extern) aufgerufen werden muss.
    Gibt es einen Kniff das zu lösen? Vielleicht ist der Ansatz auch so einfach, dass ich ihn schlichtweg übersehe.

    Danke für die Hilfe

    #include <iostream>
    using namespace std;
    
    class Base
    {
        public:
    
            Base ()
            {
                Function ();
            }
    
            virtual ~Base () {}
    
            virtual void Function ()
            {
                cout << "Base\n";
            }
    };
    
    class Child
        : public Base
    {
        public:
    
            Child () {}
            virtual ~Child () {}
    
            virtual void Function () override
            {
                Base::Function();
                cout << "Child\n";
            }
    };
    
    int main ()
    {
        Child myChild;
        return 0;
    }
    


  • By-design verhalten sich virtuelle Funktionen im Konstruktor nicht virtuell, sondern rufen immer die Funktion der aktuellen Klasse auf.
    Hintergrund ist, dass zum Zeitpunkt der Erzeugung von Base, Child noch gar nicht exisitiert und man somit eine Memberfunktion auf ein nicht erzeugtes Objekt aufrufen würde.


  • Mod

    weshalb wird hier "Base" und nicht "Child" ausgegeben?

    [class.cdtor]/4 schrieb:

    When a virtual function is called directly or indirectly from a constructor or from a destructor, including during the construction or destruction of the class’s non-static data members, and the object to which the call applies is the object (call it x) under construction or destruction, the function called is the final overrider in the constructor’s or destructor’s class and not one overriding it in a more-derived class.

    Ziel soll es sein, eine Funktion zu haben, die z.B. Member der Klasse ändert, aber nicht explizit jedes Mal im Konstruktor der Child Klasse (oder von extern) aufgerufen werden muss.

    Wie soll eine Basisklasse in ihrem Konstruktor Member der abgeleiteten Klasse modifizieren? Das würde undefiniertes Verhalten erzeugen.


Log in to reply