Überschriebene Funktion im Basiskonstruktor aufrufen



  • Hi Leute,
    ich habe seit langer Zeit mal wieder versucht eine kleine Konsolenanwendung in C++ zu programmieren und scheitere nun kläglich an einer , denke ich, einfachen Sache. Ich habe leider auch bei Google nichts gefunden was mir so wirklich geholfen hat.
    Folgendes ich habe eine Basisklass A. Diese hat einen Konstruktor, der die Funktion foo aufruft.

    class A{
    public:
        A();
        void foo();
    };
    
    A::A(){
        std::cout << "Konstruktor A" << std::endl;
        this->foo();
    }
    
    void A::foo(){
        std::cout << "foo";
    }
    

    Bis hier her kein Problem. Jetzt kommt jedoch noch die Klasse B, eine Ableitung von A, mit ins Spiel. Auch sie hat einen Konstruktor, der den von A aufrufen soll, und überschreibt dann noch die Funktion foo.

    class B : public A{
    public:
        B();
        void foo();
    };
    
    B::B() : A::A(){
        std::cout << "Konstruktor B" <<std::endl;
    }
    
    void B::foo(){
        A::foo();
        std::cout << "bar" << std::endl;
    }
    

    Und hier der Aufruf..

    int main(int argc, const char * argv[])
    {
        B b;
        return 0;
    }
    

    Ich hätte jetzt folgende Ausgabe erwartet.

    Konstruktor A
    foobar
    Konstruktor B

    Allerdings bekomme ich

    Konstruktor A
    fooKonstruktor B

    Meine Erwartung war also, dass Im Konstruktor von A die foo Funktion von B aufgerufen wird.
    Ich habe leider keine Idee was ich falsch mache...oder nach was ich noch Googlen soll...
    Meine C++ Kenntnisse wurden leider von der Zeit und vom dauernden programmieren in PHP verwaschen 😕



  • Hi,

    also zunächst Mal müsste foo virtual sein, damit das ein polymorpher Aufruf ist.

    Dann aber sind Konstruktoren so eine Sache für sich. Im constructor von A ist B noch nicht vollständig erstellt bzw. der constructor-Aufruf von A bezieht sich rein auf die A-Klasse und ignoriert den eigentlichen Typ des Objektes.

    Kurz und gut, im constructor von A kannst Du keine polymorphe Funktion aufrufen, die erst in B definiert ist. Dafür musst Du leider einen anderen Weg wählen.



  • @Eisflamme: Danke für die schnelle Antwort. Irgendwie hatte ich das anders in Erinnerung aber wie gesagt sind meine C++ Tage auch schon etwas her.



  • Farbauti schrieb:

    @Eisflamme: Danke für die schnelle Antwort. Irgendwie hatte ich das anders in Erinnerung aber wie gesagt sind meine C++ Tage auch schon etwas her.

    Hier eine kurze Bestätigung der Aussage von Eisflamme:
    http://stackoverflow.com/questions/496440/c-virtual-function-from-constructor


Anmelden zum Antworten