Frage zu Memberzugriff bei Vererbung



  • Hallo, ich habe ein Problem in einem Project. Ich habe eine freie Funktion, die ein Object der Klasse A als Argument erwartet. Diese muss in einer Klasse aufgerufen werden, die von A erbt:

    struct A
    {
    	int member;
    	void printm()
    	{
    		std::cout<<member;
    	}
    };
    void func(A a)
    {
    	a.printm();
    }
    struct B : public A
    {
    	void test()
    	{
    		func( /*?*/ );
    	}
    };
    int main()
    {
    	B b;
    	b.test();
    }
    

    Wie rufe ich diese Funktion dann auf? Oder wie muss ich mein Design verändern?
    Schonmal danke für Antworten!



  • *this



  • Was willst Du denn machen?

    Du kannst func(*this) schreiben, aber dann wird von der aktuellen Instanz eine Kopie erstellt und diese gesliced, d.h. alles, was mit B zu tun hat, fällt weg. Auf dieser Kopie wird dann printm() ausgeführt.



  • Ah, so einfach ist das. Danke schön 🙂



  • DeriveThis schrieb:

    Ah, so einfach ist das. Danke schön 🙂

    Eigentlich wollte Eisflamme dich auf ein Problem in deinem Code hinweisen, Slicing ist etwas dass man kaum haben will. Du wärst vermutlich besser beraten func() eine Referenz und keine Kopie nehmen zu lassen: func(A& a). Dann fällt das Problem mit dem Slicing auch weg...



  • in meinem Fall nimmt "func" eh eine Referenz auf die Klasse.

    struct Foo
    {
       Some member;
       void a_member_function();
    };
    void func(Foo & foo)
    {
       do_something_with_Foo(foo);
    }
    struct Bar : public Foo
    {
        void use_func()
        {
            func( *this );
        }
    };
    

    Aber wieso fällt hier das slicing weg? Es wird doch wieder nur der "Foo" Teil von Bar weitergegeben, oder?





  • nein, es wird ein zeiger weitergegeben. und von diesem zeiger kann man später noch auf die member von B zugreifen...


Log in to reply