Übergabe der konstanten Referenz als this gewertet



  • Hallo,

    ich beschäftige mich momentan mit den slicing Problem. Um es mir noch einmal vor Augen zu halten habe ich es nach programmiert:

    #ifndef base_h
    #define base_h
    
    #include <iostream>
    
    class base {
    
    public:
    	virtual void print()
    	{
    		std::cout << "base" << std::endl;
    	}
    };
    
    #endif
    
    #ifndef inherit_h
    #define inherit_h
    
    #include <iostream>
    
    #include "base.h"
    
    class inherit
    	: public base {
    
    public:
    	virtual void print ()
    	{
    		std::cout << "inherit" << std::endl;
    	}
    };
    
    #endif
    

    Und auch noch die main:

    #include "inherit.h"
    #include "base.h"
    
    void call_by_value (base b)
    {
    	b.print();
    }
    
    void call_by_reference(base& b)
    {
    	b.print();
    }
    
    int main (int argc, char** argv)
    {
    	inherit i;
    	call_by_value(i);
    	call_by_reference(i);
    	return 1;
    }
    

    Sobald ich

    void call_by_reference(base& b)
    

    durch

    void call_by_reference(const base& b)
    

    ersetze bekomme ich folgenden Fehler:

    main.cpp: In function ‘void call_by_reference(const base&)’:
    main.cpp:12: error: passing ‘const base’ as ‘this’ argument of ‘virtual void base::print()’ discards qualifiers

    Leider verstehe ich nicht den Grund für dieses Verhalten. Könnt ihr mir vielleicht sagen wieso dieser Fehler entsteht?

    Viele Grüße,
    gallagher



  • Du rufst die nicht-const Memberfunktion print auf einem konstanten Objekt auf, das geht halt nicht (das ist ja gerade der Sinn von const, dass sowas unterbunden wird.) Da dein print aber das Objekt nicht verändert, könntest du es genausogut const deklarieren:

    virtual void print() const
        {
            std::cout << "base" << std::endl;
        }
    

    (auch in allen abgeleiteten Klassen)



  • Moin bashar,

    das macht sinn. Ohne eine konstante Member-Funktion hätte die Funktion das Recht das Objekt zu verändern, aber das Objekt darf laut Signatur nicht verändert werden. Das ist inkonsistent.

    Vielen Dank,
    gallagher



  • also liegt das hier daran dass eine nichtkonstante methode auf ein konstantes objekt aufgerufen wird?

    wenn ich das richtig verstanden hab...

    aber da shat ja nix mit slicing zu tun sondern mit der const correctness



  • Der Fehler hatte nichts mit dem slicing Problem zu tun, da hast du schon recht. Das Programm an sich beschreibt aber das slicing Problem. Einfach einmal compilieren 😉

    Viele Grüße,
    gallagher


Anmelden zum Antworten